[英]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>
<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>
<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.