https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/first-mvc-app/adding-model?view=aspnetcore-3.1&tabs=visual-studio (经过代码验证,步骤都可行)

之前的示例中用过viewdata字典对象来传输控制器中的数据给视图使用。
MVC也提供了直接传输强类型对象给视图的方法。这样编译器可以在编译时期就对类型做检查。

控制器中传出数据模型

可以看看Controllers/MoviesController.cs文件

// GET: Movies/Details/5
public async Task Details(int? id)
{
    if (id == null)
    {
        return NotFound();
    }

    var movie = await _context.Movie
        .FirstOrDefaultAsync(m => m.Id == id);
    if (movie == null)
    {
        return NotFound();
    }

    return View(movie);
}

例如 https://localhost:51919/movies/details/1 控制器为moviews,行为方法为details,参数为1,也就是id=1。也可以使用如下字符串查询的url : https://localhost:51919/movies/details?id=1 ,也能达到一样的效果。

FirstOrDefaultAsync 中是lambda表达式,表示选出满足id的movie实体对象。 await表示异步等待。
return View(movie) 将满足条件的movie对象传给view视图。

视图中使用数据模型对象

查看Views/Movies/Details.cshtml ,代码如下

@model MvcMovie.Models.Movie

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

Details

Movie


@Html.DisplayNameFor(model => model.Title)
@Html.DisplayFor(model => model.Title)
@Html.DisplayNameFor(model => model.ReleaseDate)
@Html.DisplayFor(model => model.ReleaseDate)
@Html.DisplayNameFor(model => model.Genre)
@Html.DisplayFor(model => model.Genre)
@Html.DisplayNameFor(model => model.Price)
@Html.DisplayFor(model => model.Price)

第一行@model语句表示视图需要MvcMovie.Models.Movie类型的对象。然后就可以在视图页面中通过@Model.Id等方式直接使用对象,也可以通过@Html.DisplayFor(model=>model.Price)访问对象数据,这里小写的model表示一个lambda参数,实际上传入的数据就对象是Model。

控制器传出列表
上面是通过return view的方式返回一个movie对象给view的Model属性,然后哦通过Model属性来访问这个数据。
如果控制器返回的是一个List类型,该如何处理呢?
查看控制器中的index方法,这是一个返回列表的方法,当然也是用的异步返回。

// GET: Movies
public async Task Index()
{
    return View(await _context.Movie.ToListAsync());
}

视图传入列表

Index.cshtml 中可以看到 @model IEnumerable<MvcMovie.Models.Movie>这行语句表示接收的类型为一个实现了接口为IEnumerable。而List就是一个实现了枚举接口的类。所以在视图页面中可以通过循环来逐个访问对象列表中的对象。

@foreach (var item in Model) {
        
            
                @Html.DisplayFor(modelItem => item.Title)
            
            
                @Html.DisplayFor(modelItem => item.ReleaseDate)
            
            
                @Html.DisplayFor(modelItem => item.Genre)
            
            
                @Html.DisplayFor(modelItem => item.Price)
            
            
                Edit |
                Details |
                Delete