MVC中的视图模型应该如何特定于页面?

时间:2013-06-10 13:51:06

标签: asp.net-mvc asp.net-mvc-4 viewmodel

我知道MVC中的视图模型应该反映单个页面上的数据而不是模型中的对象。但视图模型是否应该与您要在该页面上显示的数据或您希望从该页面返回的数据相对应?如果我们查看登录页面,那么我只想要用户名密码回到帖子中,但是我可能需要比显示登录页面时更多的变量(以前的错误消息等)。

如果viewmodel只是包含用户名密码作为参数,其余变量最终会出现在viewbags中。或者视图模型是否应包含我想要显示的所有值,即使我只对响应中的一些值感兴趣。

使用viewmodels时的最佳做法是什么?

3 个答案:

答案 0 :(得分:1)

我认为最好将所有内容都放在视图模型中。这使代码更清洁,并使发现和维护更容易。视图模型应该是您的主要机制。

答案 1 :(得分:1)

我会说你需要的属性,在你的情况下用户名和密码。如果要显示错误消息,那么这就是ModelState的用途。您始终可以将任何错误消息附加到ModelState:

 ModelState.AddModelError("PropertyName", "Error Text")

除此之外,假设您有一个表单,其中包含从下拉列表中选择一个类别所需的类别列表。在这种情况下,我通常会将该列表附加到我的模型中,即使提交的唯一内容是实际选择的值。但这是一个偏好问题,这意味着我也可以设置一个ViewBag来包含这个类别的SelectList,然后将它绑定到DropDownList。我认为将它放在模型中会更好,因为ViewBag是动态的,你必须将ViewBag中的任何内容转换为它在视图中的底层类型。

答案 2 :(得分:1)

在html和服务器之间以某种方式进行交互的所有数据都应该在ViewModel中。 这允许您在html之外和ViewModel属性中执行格式化等。

但是,如果您的页面包含大量控件或数据,您可能希望将其拆分为多个ViewModel(示例一个用于Get,一个用于Post)。 帖子模型可能只包含您输入的数据,需要进行验证。