在MVC3中,我应该有单独的"编辑"模型与"显示"模型吗?

Jer*_*ose 18 asp.net-mvc viewmodel asp.net-mvc-3

使用MVC3,我应该设计我的视图模型,以便有一个绑定到视图(DisplayModel),还有一个回发到控制器(EditModel)?

为了澄清,我不是在询问数据模型与视图模型 - 我知道将视图/控制器绑定到数据/域模型并不好.

我也不是要求跨两个单独的视图共享一个模型,一个用于显示数据的视图,另一个用于编辑数据的视图.

相反,我问的是一个用于编辑数据的视图,以及绑定到视图的模型与绑定到控制器操作的模型.

换句话说,如果这是我的观点:

@model MyApp.Models.CustomerModel
Run Code Online (Sandbox Code Playgroud)

我的控制器动作应该是这样的:

public ActionResult Index(CustomerModel model)
Run Code Online (Sandbox Code Playgroud)

要么:

public ActionResult Index(CustomerEditModel model)
Run Code Online (Sandbox Code Playgroud)

有一次,我们正在做后者(单独).但最近,我们开始做前者(共享).

这种变化的原因是因为:

  1. 使用MVC3不引人注意的验证,如果我在我的模型上使用DataAnnotations进行验证,如果它们是分开的(在显示模型上映射客户端验证,在服务器端验证的编辑模型上),则需要在两个模型中使用它们. .

  2. 随着我们的应用程序的成熟,我们意识到我们的显示和编辑模型是95%相同的,除了我们的视图模型中的选择列表.我们现在将它们移动到一个共享类,现在通过视图传递它们.

但我已经看到其他一些讨论指出,让视图/控制器共享模型是一个坏主意,并且它违反了关注点的分离.

有人可以帮我理解这两种方法的权衡吗?

Ric*_*lly 6

我已经看到了非常好的论据支持和反对,它只取决于哪种方法最适合您的应用.没有一种尺寸适合所有方法都可以应用!

如果你还没有读过它,Jimmy Bogard写了一篇关于他的团队如何在这里做MVC的非常好的帖子,其中涵盖了这个主题.