ASP.NET MVC ViewData 和视图模型最佳实践

4

最初的情况是我将我的领域模型映射到演示模型。

我必须显示一个带有文本框和下拉列表的更新/创建表单。

视图模型应该包含下拉列表的列表还是应该使用ViewData传递下拉列表的数据?

何时应该使用ViewData,何时不应该使用它?

像下拉列表这样的输入字段是否应该有单独的视图模型?

5个回答

4

我倾向于尽可能少地使用ViewData,因为您总是需要转换值,需要检查null或不存在的键,并且在我看来它会使视图混乱。

我倾向于尽可能使用viewmodel,因为我发现将视图强类型化到模型是一种更清晰的方法。

我会尽可能将数据放入viewmodel中,但仅限于有意义的数据。对于不应该属于viewmodel的数据,我会将其作为ViewData传递,但会尽量保持数量最少。

至于您关于输入字段的问题,如果它们都相关,则应创建一个ViewModel,而不是在ViewData中传递5或10个数据,因为在一个地方逻辑上将它们分组是有意义的。这确实是一种偏好,但我发现这种方法对我来说是最好的。


2

这真的是个人选择。ViewData 的缺点是它弱类型并且需要转换。


2

你可能想要查看 NerdDinner,特别是 DinnerFormViewModel 和国家选择列表。基本上,他们有一个 Dinner 模型(用于索引视图,需要一个集合),以及一个包含单个 Dinner 实例和 SelectList 的 DinnerFormViewModel。创建视图(适当地命名为 DinnerForm)当然是强类型的,并且接受一个 DinnerFormViewModel。


2

1
我将这一步进一步。不是在控制器中设置ViewData字段,而是使用ActionFilter查找模型上的空选项列表,并根据通用类型自动填充它们。(当然,如果您有一些特定于视图的逻辑来确定要显示哪些选项,则此方法无法奏效。)例如,Options<UserType> 将被填充为所有UserTypes的列表。 - Ryan
这个答案中的链接已经失效了。 - PixelPlex

1

你应该将列表作为模型的一部分传递。或者,如果列表非常普遍(比如说州列表或是一个是/否列表),你可以在静态类中创建一个静态列表,直接在你的视图页面中引用它。我不明白为什么你想通过ViewData传递它,因为你需要在视图页面中转换你的列表。


http://weblogs.asp.net/rashid/archive/2009/11/27/extending-asp-net-mvc-2-templates.aspx - Rookian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接