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

7

我希望我的视图如下:

@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

这样做是否正确,或者有更好的方法吗?


Paul Aldred-Bann 给出了一个正确的例子。 - Shashank Chaturvedi
就我的MVC经验而言,我发现其中一件事是,在您的模型上不应该有任何类型的验证,例如[Required]属性,或者实际上任何属性。所有验证都应该在ViewModel属性上进行,而不是在Model属性上进行。我相信所有答案也仍然有效,这是关于“简单最佳实践”的问题。 - Aritra B
4个回答

4

使用 视图模型,这样您就可以将所需的模型传递给视图。我还使用视图模型来处理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方法,只需具有一个集合属性)。希望本次答案能够为您澄清一些问题?

1
这是真正的最佳实践。加油+1,同时OP的做法比其他答案更好。 - Ramesh Rajendran
是的,这似乎就是我在寻找的东西。谢谢你的帮助。 - John 'Mark' Smith

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
}

1
您的想法是正确的,需要两个模型类。但我建议使用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>
}

1
在这种情况下使用了一个逻辑概念,那就是ViewModel。一个ViewModel类可以包含几个模型对象和其他属性,具体取决于视图。ViewModel应该具有View所需的所有数据。因此,在您的情况下,创建一个名为DocumentViewModel的ViewModel,并创建另外两个模型的对象。
希望这可以帮助您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接