若是頁面須要展現多種信息類型,則經過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
執行項目,能夠看到看看效果。