若是页面须要展现多种信息类型,则经过poco的movie类没法完成这样的信息。此时须要定义一个viewmodel对象,来进行数据模型的使用。这个viewmodel里面包含相对复杂一些的数据结构,好比,包含一个列表和一个类集合等。
ViewModel表示一个概念,并非具体的某个类。html
假设,要在页面上添加一个搜索,搜索下拉框中能够选择movie的Genre类型,输入框中搜索movie的Title。数据结构
MovieGenreViewModelasync
在models目录下,新建添加一个MovieGenreViewModel
ide
using Microsoft.AspNetCore.Mvc.Rendering; using System.Collections.Generic; namespace MvcMovie.Models { public class MovieGenreViewModel { public List<Movie> Movies { get; set; } public SelectList Genres { get; set; } public string MovieGenre { get; set; } public string SearchString { get; set; } } }
其中包括:spa
控制器中使用ViewModel类型code
MoviesController.cs中的index方法代码改成以下orm
// GET: Movies public async Task<IActionResult> Index(string movieGenre, string searchString) { //使用LINQ表达式,LINQ表达式不是当即执行的,而是在使用的时候才会执行,这里是在最后ToListAsync()方法调用的时候才会执行。 IQueryable<string> genreQuery = from m in _context.Movie orderby m.Genre select m.Genre; var movies = from m in _context.Movie select m; if (!string.IsNullOrEmpty(searchString)) { //Lambda+LINQ结合使用,找出符合条件的结果。 movies = movies.Where(s => s.Title.Contains(searchString)); } if (!string.IsNullOrEmpty(movieGenre)) { //Lambda+LINQ结合使用,找出符合Genre的结果。 movies = movies.Where(x => x.Genre == movieGenre); } var movieGenreVM = new MovieGenreViewModel { Genres = new SelectList(await genreQuery.Distinct().ToListAsync()), Movies = await movies.ToListAsync() }; //建立新的ViewModel类型对象 return View(movieGenreVM); }
View中使用Viewmodelhtm
在Views/Movies/Index.cshtml中,代码以下对象
@model MvcMovie.Models.MovieGenreViewModel @{ ViewData["Title"] = "Index"; } <h1>Index</h1> <p> <a asp-action="Create">Create New</a> </p> <form asp-controller="Movies" asp-action="Index" method="get"> <p> <select asp-for="MovieGenre" asp-items="Model.Genres"> <option value="">All</option> </select> Title: <input type="text" asp-for="SearchString" /> <input type="submit" value="Filter" /> </p> </form> <table class="table"> <thead> <tr> <th> @Html.DisplayNameFor(model => model.Movies[0].Title) </th> <th> @Html.DisplayNameFor(model => model.Movies[0].ReleaseDate) </th> <th> @Html.DisplayNameFor(model => model.Movies[0].Genre) </th> <th> @Html.DisplayNameFor(model => model.Movies[0].Price) </th> <th></th> </tr> </thead> <tbody> @foreach (var item in Model.Movies) { <tr> <td> @Html.DisplayFor(modelItem => item.Title) </td> <td> @Html.DisplayFor(modelItem => item.ReleaseDate) </td> <td> @Html.DisplayFor(modelItem => item.Genre) </td> <td> @Html.DisplayFor(modelItem => item.Price) </td> <td> <a asp-action="Edit" asp-route-id="@item.Id">Edit</a> | <a asp-action="Details" asp-route-id="@item.Id">Details</a> | <a asp-action="Delete" asp-route-id="@item.Id">Delete</a> </td> </tr> } </tbody> </table>
第一行@model MvcMovie.Models.MovieGenreViewModel 表示须要接收该类型的数据对象。
<select asp-for="MovieGenre" asp-items="Model.Genres"> 这行代码是一个select标签,使用的是数据模型的Genres属性,这个属性在以前定义过,是一个SelectList类型。get
执行项目,能够看到看看效果。