为每个Model CRUD操作分离ASP.NET MVC View对象?

mik*_*nne 3 asp.net asp.net-mvc

我一直在阅读的大多数MVC教程似乎为每个模型创建了4个View对象.例如,如果我的模型是"Foo",则似乎有4个.cshtml文件:Foo/Create,Foo/Delete,Foo/Details和Foo/Edit.使用VisualStudio"scaffolding"帮助程序也可以.

这真的被认为是MVC的最佳实践吗?让4个类彼此相同的80-90%是错误的.当我向Foo添加一个新字段时,我需要编辑所有4个.cshtml文件.这种双重维护(四维护理?)只是让我的OO皮肤爬行.

请告诉我:是否有预期/接受的最佳实践以不同方式处理此问题?或者,如果这真的被接受为最佳实践,请告诉我为什么四维不应该让我感到不安.

我是一位相当熟练的ASP.NET/c#/ OO设计老手,但对于MVC来说还是个新手; 如果这是一个菜鸟问题,请道歉.在此先感谢您的帮助!

编辑:感谢所有的回复!我标记了最彻底的一个作为答案,但赞成所有有用的.

Tom*_*han 5

您可能需要两到四种不同的视图:

  • 清单(查看很多东西)
  • 查看(用于查看单个内容.可能没有必要,如果可以使用"编辑为视图",或者"列表有空间显示所有属性")
  • 创建
  • 编辑(如果巧妙编码,可以与创建相同)

因此,如果您的模型没有太多属性可以在表格中显示它们,并且如果您没有静态的,不可编辑的视图来进行检查,那么只需使用List和Edit即可,并废除其他两个.

但是,如果您更新模型,这并不能解决您的双重(或三重)维护问题.还有其他的魔力;)

在ASP.NET MVC 3,上有扩展HtmlHelper,让你做Html.DisplayForModel()Html.EditorForModel().它们使用预定义模板将自己嵌套到对象中,并为所有公共属性绘制显示/编辑字段.如果传递DisplayForModel一个IEnumerable<Foo>,它将创建一个包含列标题的表,该列标题是Foo(DisplayName如果提供了属性信息,则使用属性信息)的属性名称,每行代表一个Foo实例.如果你给EditorForModel一个Foo,这将创建一个<label><input>对每个公共属性Foo.

如果您对默认值不满意,可以替换这些强大的扩展方法使用的所有模板.这可以在级别上完成Foo,在这种情况下,您将返回到双重维护方案,或者在较低级别(例如stringDateTime)上,以影响使用模板生成的所有编辑器/显示字段.

有关其工作原理的更多信息,请参阅Google"ASP.NET MVC 3编辑器模板"并阅读几个教程.他们会比我更好地解释细节.