我知道 MVC 中的视图模型应该反映单个页面上的数据,而不是模型中的对象。但是视图模型应该对应于您想要在该页面上显示的数据还是您想要从该页面返回的数据?例如,如果我们查看登录页面,那么我只想在帖子中返回用户名和密码,但我可能需要比显示登录页面时更多的变量(以前的错误消息等)。
那么视图模型是否应该只包含用户名和密码作为参数,而其余变量最终会出现在视图包中。或者视图模型是否应该包含我想要显示的所有值,即使我只对响应中的一些值感兴趣。
使用视图模型时的最佳做法是什么?
我知道 MVC 中的视图模型应该反映单个页面上的数据,而不是模型中的对象。但是视图模型应该对应于您想要在该页面上显示的数据还是您想要从该页面返回的数据?例如,如果我们查看登录页面,那么我只想在帖子中返回用户名和密码,但我可能需要比显示登录页面时更多的变量(以前的错误消息等)。
那么视图模型是否应该只包含用户名和密码作为参数,而其余变量最终会出现在视图包中。或者视图模型是否应该包含我想要显示的所有值,即使我只对响应中的一些值感兴趣。
使用视图模型时的最佳做法是什么?
我认为最好将所有内容都放在视图模型中。这使代码更干净,也使发现和维护更容易。视图模型应该是您的主要机制。
我只会说您需要的属性,在您的情况下是用户名和密码。如果您想显示错误消息,那么这就是 ModelState 的用途。您始终可以将任何错误消息附加到您的 ModelState:
ModelState.AddModelError("PropertyName", "Error Text")
除此之外,假设您有一个包含类别列表的表单,您需要从下拉列表中选择一个类别。在这种情况下,我通常将该列表附加到我的模型中,即使提交的唯一内容是实际选择的值。但这是一个偏好问题,这意味着我还可以设置一个 ViewBag 来包含这个 SelectList 类别,然后将其绑定到您的 DropDownList。我想最好将它放在模型中,因为 ViewBag 是动态的,您必须将 ViewBag 中的任何内容转换为视图的基础类型。
以某种方式在 html 和您的服务器之间交互的所有数据都应该在 ViewModel 中。这允许您在 html 之外和 ViewModel 属性内执行格式化等。
但是,如果您的页面包含大量控件或数据,您可能希望将其拆分为多个 ViewModel(例如一个用于 Get,一个用于 Post)。post 模型可能只包含您输入的数据并且需要验证。