asp.net core mvc (6)ViewModel视图模型对象的使用

若是页面须要展现多种信息类型,则经过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

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

控制器中使用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

执行项目,能够看到看看效果。

相关文章
相关标签/搜索