12

假设您想开发控制器以便使用 ViewModel 来包含您呈现的 View 的数据,那么所有数据都应该包含在 ViewModel 中吗?什么情况下可以绕过 ViewModel?

我问的原因是我处于一些代码使用 ViewData 而一些正在使用 ViewModel 的位置。我想在团队中分发一套指导方针,说明何时使用 ViewData 是正确的,何时只是走捷径。我想从其他处理过这个问题的开发人员那里得到意见,这样我就知道我的指导方针不仅仅是我有偏见。

4

4 回答 4

9

只是为了进一步Fabian的评论;您可以按照本文中概述的步骤明确确保永远不会使用 viewdata 。真的没有理由为所有事情都使用模型。

如果您别无选择,只能使用 ViewData(例如在现有项目中);至少使用字符串常量来解析名称以避免使用“魔术字符串”。类似于以下内容:ViewData[ViewDataKeys.MyKey] = myvalue;事实上,我将它用于几乎任何需要“基于字符串”的东西(会话键、缓存键、VaryByCustom 输出缓存键等)。

于 2010-08-06T11:23:47.790 回答
4

当您的视图变得更加复杂时,您可能希望考虑的一种方法是保留对输入字段的模型的使用,并使用 ViewData 来支持视图需要呈现的任何其他内容。

至少有几个论据支持这一点:

  1. 您有一个需要一些数据的母版页(例如,标题中的 StackOverflow 用户信息之类的东西)。应用站点范围的 ActionFilter 可以在每次操作后轻松地在 ViewData 中填充此信息。将其放入模型中需要站点中的所有其他模型然后从基础模型继承(这最初可能看起来不错,但很快就会变得复杂)。

  2. 当您验证已发布的表单时,如果存在验证错误,您可能希望将模型(带有无效字段)重新绑定回视图并显示验证消息。这很好,因为输入字段中的数据会被回发并绑定到模型,但是您的视图需要重新填充的任何其他数据呢?(例如下拉列表值、信息消息等)这些将不会被回发,并且将这些重新填充到“围绕”回发输入值的模型上可能会变得混乱。使用..view 数据填充 ViewData 的方法通常更简单。

根据我的经验,我发现这种方法效果很好。

而且,在 MVC3 中,动态 ViewModel意味着不再有字符串索引!

于 2010-08-10T03:54:57.377 回答
2

我个人从不使用 ViewData,一切都通过模型进行,除非我在测试某些东西并且我很快需要能够看到视图上的值。强类型!

于 2010-08-06T11:12:25.803 回答
1

就 ASP.NET MVC 2 而言,ViewModel 模式是首选方法。该方法充分利用了编译时静态类型检查。这与编译 mvc 视图相结合将使您的开发工作流程更快、更高效,因为在构建/编译时而不是运行时检测到错误。

于 2010-08-06T12:29:17.537 回答