asp.net core mvc(4)控制器和視圖的數據傳遞

https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/first-mvc-app/adding-model?view=aspnetcore-3.1&tabs=visual-studio (通過代碼驗證,步驟均可行)html

以前的示例中用過viewdata字典對象來傳輸控制器中的數據給視圖使用。
MVC也提供了直接傳輸強類型對象給視圖的方法。這樣編譯器能夠在編譯時期就對類型作檢查。mvc

控制器中傳出數據模型app

能夠看看Controllers/MoviesController.cs文件異步

// GET: Movies/Details/5
public async Task<IActionResult> 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 ,也能達到同樣的效果。async

FirstOrDefaultAsync 中是lambda表達式,表示選出知足id的movie實體對象。 await表示異步等待。
return View(movie) 將知足條件的movie對象傳給view視圖。ide

視圖中使用數據模型對象visual-studio

查看Views/Movies/Details.cshtml ,代碼以下url

@model MvcMovie.Models.Movie

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

<h1>Details</h1>

<div>
    <h4>Movie</h4>
    <hr />
    <dl class="row">
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.Title)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.Title)
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.ReleaseDate)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.ReleaseDate)
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.Genre)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.Genre)
        </dd>
        <dt class="col-sm-2">
            @Html.DisplayNameFor(model => model.Price)
        </dt>
        <dd class="col-sm-10">
            @Html.DisplayFor(model => model.Price)
        </dd>
    </dl>
</div>
<div>
    <a asp-action="Edit" asp-route-id="@Model.Id">Edit</a> |
    <a asp-action="Index">Back to List</a>
</div>

第一行@model語句表示視圖須要MvcMovie.Models.Movie類型的對象。而後就能夠在視圖頁面中經過@Model.Id等方式直接使用對象,也能夠經過@Html.DisplayFor(model=>model.Price)訪問對象數據,這裏小寫的model表示一個lambda參數,實際上傳入的數據就對象是Model。code

控制器傳出列表
上面是經過return view的方式返回一個movie對象給view的Model屬性,而後哦經過Model屬性來訪問這個數據。
若是控制器返回的是一個List類型,該如何處理呢?
查看控制器中的index方法,這是一個返回列表的方法,固然也是用的異步返回。htm

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

視圖傳入列表

Index.cshtml 中能夠看到 @model IEnumerable&lt;MvcMovie.Models.Movie&gt;這行語句表示接收的類型爲一個實現了接口爲IEnumerable。而List就是一個實現了枚舉接口的類。因此在視圖頁面中能夠經過循環來逐個訪問對象列表中的對象。

@foreach (var item in Model) {
        <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>
相關文章
相關標籤/搜索