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