什么时候使用ViewData而不是ViewModels?

时间:2010-08-06 11:04:18

标签: asp.net-mvc viewmodel viewdata

假设您要开发控制器以便使用ViewModel来包含您呈现的视图的数据,那么所有数据是否应包含在ViewModel中?绕过ViewModel会有什么条件?

我问的原因是我处于某些代码使用ViewData的位置,而有些代码正在使用ViewModel。我想在团队中分发一套关于何时正确使用ViewData的指南,以及何时只是采用快捷方式。我希望得到其他开发人员的意见,以便我知道我的指导方针不仅仅是我的偏见。

4 个答案:

答案 0 :(得分:9)

进一步发表法比安的评论;您可以按照this article中列出的步骤明确确保从不使用viewdata。 没有理由为所有事情使用模型。

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

答案 1 :(得分:4)

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

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

  1. 您有一个主页面需要一些数据(例如标题中的StackOverflow用户信息)。应用站点范围的ActionFilter可以在每次操作后轻松地在ViewData中填充此信息。将它放入模型中需要网站中的每个其他模型都从基础模型继承(这最初可能看起来不是很糟糕,但它可能很快变得复杂)。

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

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

    而且,在MVC3中,dynamic ViewModels意味着不再有字符串索引!

答案 2 :(得分:2)

我个人从不使用ViewData,一切都通过模型,除非我测试的东西,我很快就需要能够看到视图上的值。 Strongtyping!

答案 3 :(得分:1)

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