如果页面需要展示多种信息类型,则通过poco的movie类无法完成这样的信息。此时需要定义一个viewmodel对象,来进行数据模型的使用。这个viewmodel里面包含相对复杂一些的数据结构,比如,包含一个列表和一个类集合等。
ViewModel表示一个概念,并不是具体的某个类。

假设,要在页面上添加一个搜索,搜索下拉框中可以选择movie的Genre类型,输入框中搜索movie的Title。

MovieGenreViewModel

在models目录下,新建添加一个MovieGenreViewModel

using Microsoft.AspNetCore.Mvc.Rendering;
using System.Collections.Generic;

namespace MvcMovie.Models
{
    public class MovieGenreViewModel
    {
        public List Movies { get; set; }
        public SelectList Genres { get; set; }
        public string MovieGenre { get; set; }
        public string SearchString { get; set; }
    }
}

其中包括:

  • 一个movies的集合。
  • 一个SelectList对象,该对象可以方便用于cshtml中的selector绑定数据。
  • 一个MovieGenre,表示要搜索的类别。
  • 一个SearchString,表示Title中要包含的关键字。

控制器中使用ViewModel类型

MoviesController.cs中的index方法代码改为如下

// GET: Movies
public async Task Index(string movieGenre, string searchString)
{
    //使用LINQ表达式,LINQ表达式不是立即执行的,而是在使用的时候才会执行,这里是在最后ToListAsync()方法调用的时候才会执行。
    IQueryable 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中使用Viewmodel

在Views/Movies/Index.cshtml中,代码如下

@model MvcMovie.Models.MovieGenreViewModel

@{
    ViewData["Title"] = "Index";
}

Index

Create New

Title:

@foreach (var item in Model.Movies) { }
@Html.DisplayNameFor(model => model.Movies[0].Title) @Html.DisplayNameFor(model => model.Movies[0].ReleaseDate) @Html.DisplayNameFor(model => model.Movies[0].Genre) @Html.DisplayNameFor(model => model.Movies[0].Price)
@Html.DisplayFor(modelItem => item.Title) @Html.DisplayFor(modelItem => item.ReleaseDate) @Html.DisplayFor(modelItem => item.Genre) @Html.DisplayFor(modelItem => item.Price) Edit | Details | Delete

第一行@model MvcMovie.Models.MovieGenreViewModel 表示需要接收该类型的数据对象。