[英]Simple best practices for ASP.NET models
我希望我的視圖如下:
@model MyProgram.Models.DocumentList
@{
ViewBag.Title = "View1";
}
@foreach (MyProgram.Models.Document doc in Model.GetDocs())
{
<p>doc.Content</p>
}
這讓我相信我需要一個包含另一個模型列表的模型。 所以在一個只包含這個的項目中我會:
/Model/DocumentList.cs
/Model/Document.cs
這是正確的還是有更好的方法?
使用View Models ,您可以根據需要將盡可能多的模型傳遞給視圖。 我還使用視圖模型來處理POST等的驗證。因此,在您的情況下,您可以執行以下操作:
你的視圖模型
public class MyViewModel
{
public string PageTitle { get; set; }
public DocumentList DocList { get; set; }
// You could use your DocumentList object here, or if you
// don't want to, just pass a List<T> of Document
public List<Document> DocList { get; set; }
}
你的觀點
@model MyViewModel
@{
ViewBag.Title = Model.PageTitle;
}
@foreach (var doc in Model.DocList)
{
<p>doc.Content</p>
}
MVC還有很多,比如顯示和編輯模板,所以我在網上看一些涵蓋MVC要點的好教程。
編輯
公平地說,回過頭來看,你已經有點遵循這個原則,只是DocumentList
是你的視圖模型(並且你真的不需要GetDocs
方法,只需要一個集合屬性,除非你正在執行邏輯返回之前的集合是)。
希望這個答案有助於為您澄清一些事情嗎?
這取決於您的需求。 如果您只需要查看文檔模型列表,我只會使用Document
模型並將傳遞的視圖模型更改為:
@model List<MyProgram.Models.Document>
@{
ViewBag.Title = "View1";
}
@foreach (MyProgram.Models.Document doc in Model)
{
<p>doc.Content</p>
}
但是,如果您在視圖中需要更多屬性或方法,那么我將使用包含List<MyProgram.Models.Document>
的視圖模型和其他屬性。
@model DocumentsViewModel
@{
ViewBag.Title = "View1";
}
@foreach (MyProgram.Models.Document doc in Model.DocumentList)
{
<p>doc.Content</p>
}
模型:
public class DocumentsViewModel
{
public List<MyProgram.Models.Document> DocumentList {get; set;}
... other properties
}
假設您需要2個模型類,這是正確的。
我會使用List屬性,所以你的代碼看起來像:
@foreach (var doc in Model.Docs)
另外:標准mvc為每個控制器創建一個模型文件夾。
因此,默認情況下,mvc項目看起來像
root
Controllers
YourFirstController
Views
YourFirst
Index
Models
YourFirst
DocumentList
Document
*更新:如果您只想要一個項目列表,您也可以將List傳遞給您的模型,如下所示:
@model List<MyProgram.Models.Document>
@{
ViewBag.Title = "View1";
}
@foreach (var doc in Model)
{
<p>doc.Content</p>
}
在這種情況下采用了邏輯概念。 這叫做ViewModel。 視圖模型類可以包含多個模型對象和其他屬性,具體取決於視圖。 ViewModel應該包含View所需的所有數據。 因此,在您的情況下,創建一個名為DocumentViewModel的ViewModel並創建另外兩個模型的對象。
希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.