簡體   English   中英

如何將 model 傳遞給視圖 .NET 核心實體框架

[英]How pass a model to a view .NET Core Entity Framework

我嘗試學習實體框架,我喜歡理解一個基本概念。

在測試程序中,我有以下代碼:

ApplicationDbContext.cs

  public class ApplicationDbContext : DbContext
  {
        public DbSet<Book> Books { get; set; }
  }

BooksController.cs

public IActionResult Index()
{
    ViewBag.Books = _db.Books.ToList();
    return View();
}

索引.cshtml

<br />
<div class="container row p-0 m-0">
    <div class="col-6">
        <h2 class="text-info">Book List</h2>
    </div>
    <div class="col-3 offset-3">
        <a asp-action="Upsert" asp-controller="Books" class="btn btn-info form-control text-white">
            Add New Book
        </a>
    </div>

    <div class="col-12 border p-3">
        <table id="DT_load" class="table table-striped table-bordered" style="width:100%">
            <thead>
                <tr>
                    <th>Name</th>
                    <th>Author</th>
                    <th>ISBN</th>
                    <th>IdCat</th>
                    <th>DescCat</th>
                    <th></th>
                </tr>

                @foreach (var book in ViewBag.Books)
                {
                <tr>
                    <td>@book.Name</td>
                    <td>@book.Author</td>
                    <td>@book.ISBN</td>
  
                    <td>
                        <div class="text-center">
                            <a href="/Books/Upsert?id=@book.Id" class='btn btn-success text-white' style='cursor:pointer; width:70px;'>
                                Edit
                            </a>
                            &nbsp;
                            <a class='btn btn-danger text-white' style='cursor:pointer; width:70px;'
                               onclick= "/books/Delete?id=@book.Id">
                                Delete
                            </a>
                        </div>



                    </td>
                </tr>
                }

            </thead>
        </table>
    </div>
</div>

這段代碼像我期望的那樣工作,並顯示所有書籍的網格。

但坦率地說,我認為這不是使用 controller 和模型的正確方法。

我喜歡在視圖中傳遞列表:

   return View(_db.Books.ToList());

或使用另一種格式並將其用作 model,方法是在 index.cshtml 中添加如下行:

@model "my parameter"

簡而言之,在 ViewBag 的地方,我喜歡使用 model。

首先,我問:我喜歡做什么是正確的嗎?

或者在這種情況下我可以保留 ViewBag 因為代碼有效並且這種方法是正確的?

這個問題不僅是為了找到一個可行的解決方案,而且是為了找到遵循 MVC 概念的最佳實踐。

謝謝 !

您可以嘗試如下。

你的 controller

public IActionResult Index()
{
    var books = _db.Books.ToList();
    return View(books);
}

看法

@model IEnumerable<YourNamespace.Models.Book>

@foreach (var book in Model)
{
<tr>
    <td>@book.Name</td>
    <td>@book.Author</td>
    <td>@book.ISBN</td>

    <td>
        <div class="text-center">
            <a href="/Books/Upsert?id=@book.Id" class='btn btn-success text-white' style='cursor:pointer; width:70px;'>
                Edit
            </a>
            &nbsp;
            <a class='btn btn-danger text-white' style='cursor:pointer; width:70px;'
               onclick= "/books/Delete?id=@book.Id">
                Delete
            </a>
        </div>
    </td>
</tr>
}

首先,我問:我喜歡做什么是正確的嗎?

是的,大多數開發人員更喜歡類型化的視圖模型而不是 ViewBag 用於非平凡的視圖。 這樣,編譯器可以幫助您在視圖中查找拼寫錯誤,並且 IDE 可以提供 itellisense。

但我需要傳遞一個列表或類似的而不是 class

那沒關系。 您為您的視圖提供了一個“某些類”的實例。 如果是列表,則 "some class" = List<Book>

 // in your view
 @model System.Collections.Generic.List<MyApp.Models.Book>

 // loop
 @foreach(var book in Model) 

(您必須調整命名空間)

但...

在許多情況下,您需要的不僅僅是列表,因此它有助於擁有一個單獨的視圖 model class,它可以像這樣簡單

public record BooksListViewModel(List<Book> Result);

// in your controler
return View(new BooksListViewModel(books));

// in your view
@model WebApplication1.ViewModels.BooksListViewModel

@foreach(var book in Model.Result)

請注意,我使用了 C# 9 的新record功能。如果您使用的是舊版本,則必須創建一個具有單個屬性“結果”的“普通”class。 請參閱https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-9#record-types

遵循的最佳實踐是創建一個視圖 model 並將該視圖 model 用於該視圖。 這允許您以最少的額外工作添加新功能。 通常,您將有不同的視圖來添加/編輯、刪除、顯示等。

Model

public class BooksViewModel
{
    public List<Book> books = null;
}

Controller

public IActionResult Index()
{
    var viewModel = new BooksViewModel();
    viewModel.books = _db.Books.ToList();

    return View(viewModel);
}

看法

@model BooksViewModel

@foreach (var book in Model.books)
{
    
}

現在,如果您想向此視圖添加一些其他數據,只需將其添加到 model 並將其填充到 controller 中即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM