ASP.NET模型的简单最佳实践

时间:2014-02-28 09:44:45

标签: c# asp.net-mvc asp.net-mvc-4

我希望我的视图如下:

@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

这是正确的还是有更好的方法?

4 个答案:

答案 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,并创建另外两个模型的对象。

希望这有帮助。