【问题标题】:best practice for what is in a ViewModelViewModel 中的最佳实践
【发布时间】:2010-10-29 03:16:37
【问题描述】:

我想知道这是一个好主意还是坏主意,在 ViewModel 中放置国家列表之类的东西,以绑定到下拉列表?例如在网站的注册页面上。

我的印象是 ViewModel 应该代表已填写表单的一个实例,但我认为我可能错了,因为我看到其他人在他们的 ViewModel 中放置了列表等内容。

将它放在某个静态类中并直接从视图中调用不是更好吗?

像 CommonData.ListCountries();然后在视图中直接使用 Lambda 转换为 SelectList 项目列表?

【问题讨论】:

    标签: asp.net-mvc drop-down-menu viewmodel


    【解决方案1】:

    您已经意识到有多种方法可以实现您的目标。虽然MVC design pattern 鼓励某些应用程序组织您如何组织模型、视图和控制器,但最终是一个偏好问题。

    Scott Allen 在博客文章中讨论了他与ASP.NET MVC drop down lists 打交道的偏好。 Scott 使用扩展方法将复杂类型的可枚举转换为模型上的IEnumerable<SelectListItem>。然后他描述了在回发时 ASP.NET MVC 不会返回他发送到视图的IEnumerable<SelectListItem>,而只会返回用户选择的值。然后他建议使用两个模型可以简化事情。

    这是对我所说的 ViewModel 和 FormModel 的合理描述。 ViewModel 将显示数据传送到视图,FormModel 用于将收集的数据传送回控制器操作。进一步解释:

    • ViewModel 包含有助于呈现视图的数据。通过以这种方式组织我的 ViewModel,我可以放置所有必要的信息,以将特定视图呈现到关联的模型中。这使我不必将 ViewData 用于不是真正临时的任何事情。
    • FormModel 用于收集用户输入。 FormModel(几乎)从不包含对其他复杂类型的引用,并且由基元、日期时间和字符串组成。

    无论哪种情况,我对never reuse a model for a different view 都有严格的规定。让您的模型与用于渲染它们的视图紧密对齐,使您的视图更易于编写。您不必担心静态方法之类的事情,因为您的模型应该以易于呈现的形式将数据传送到它们的关联视图。 AutoMapper 之类的工具可以帮助将域对象“扁平化”为模型以进行显示。

    更多阅读结帐:ASP.NET MVC terminology is tripping me up - why 'ViewModel'?

    【讨论】:

    • 感谢您的解释。但是,如果我不使用 AJAX,那么在表单上显示错误并重新绑定下拉列表的最简洁方式是什么?我不能真正创建我的视图模型的新实例,因为它包含一个部分填充的表单,但我仍然需要重新创建国家列表以第二次传回视图。
    • lahsrah:我为 viewmodel 创建了 .populate() 方法,并从控制器及其仅填充下拉菜单中调用该方法,其他属性从表单提交中保留
    【解决方案2】:

    无论您的 View 需要什么数据,都将其放入 ViewModel。

    我的看法是,一旦你的视图通过渲染过程,它应该从它所绑定的模型中获得它需要的所有信息。

    如果你开始使用辅助方法,那么视图在某种意义上是“回到控制器”。扩展/辅助方法适用于格式化等,但它们不应该通过模型调用

    别忘了,您还有 ViewData(基本上是 HttpContext.Current.Items,为单个请求而存在),这是一种轻量级存储机制,可用于在部分视图之间共享数据(例如)。

    【讨论】:

    • 好的,那么我该如何处理表单中存在验证错误并且需要将 ViewModel 传递回原始操作以显示部分填充的表单的情况,我需要获取从数据库中再次列出。在视图模型上添加一个 Populate 方法以在将其传递回视图之前重新填充这些下拉列表是一个好主意,这样我就不会在两个地方填充下拉列表?
    • 不,这不是一个好主意。 ViewModel 应该是简单的存储机制来保存数据,而不是检索它。它应该只有属性(一般来说)。请记住,这不是 Web 表单。没有 ViewState,您的请求应该是无状态的。如果在您提交表单后,您再次需要一些数据,go get it again,只需将值设置到 ViewModel 中。验证错误应由模型状态处理。看看 www.asp.net/mvc 上的一些视频/教程
    • 比重新获取数据更好的是执行 AJAX 表单发布并让客户端(例如 Javascript)决定在返回成功或错误消息后重定向页面的位置。
    • @Ryan - 绝对。只是不要“回调辅助方法”。
    猜你喜欢
    • 2010-10-14
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 2013-05-09
    • 2023-03-12
    • 2011-09-22
    相关资源
    最近更新 更多