我希望我的视图如下:
@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
这是正确的还是有更好的方法?
答案 0 :(得分:4)
使用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还有很多比这更多的内容,例如Display and Editor Templates所以我在网上看一些涵盖MVC要点的好教程。
修改强>
公平地说,回过头来看,你已经有点遵循这个原则,DocumentList
就是你的观点模型(你真的不需要GetDocs
1}}方法,只有一个集合属性,除非你在返回之前对集合执行逻辑)。
希望这个答案有助于为您澄清一些事情?
答案 1 :(得分:2)
这取决于您的需求。如果您只需要查看文档模型列表,我只会使用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 :(得分:1)
你认为你需要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>
}
答案 3 :(得分:1)
在这种情况下采用了逻辑概念。这叫做ViewModel。视图模型类可以包含多个模型对象和其他属性,具体取决于视图。 ViewModel应该包含View所需的所有数据。因此,在您的情况下,创建一个名为DocumentViewModel的ViewModel,并创建另外两个模型的对象。
希望这有帮助。