asp.Netcore mvc(4)コントローラとビューのデータ転送


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属性でこのデータにアクセスします.コントローラがリストタイプを返す場合、どのように処理しますか?コントローラのindexメソッドを表示します.これはリストを返すメソッドで、もちろん非同期で返します.
// GET: Movies
public async Task Index()
{
    return View(await _context.Movie.ToListAsync());
}

ビュー入力リストIndex.cshtmlにおいて、@model IEnumerable<MvcMovie.Models.Movie>行の文は、受信されたタイプがIEnumerableとして実装されたインタフェースであることを示す.リストは列挙インタフェースを実現したクラスである.したがって、ビューページでは、オブジェクトリスト内のオブジェクトにループで1つずつアクセスできます.
@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