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

时间:2010-06-19 08:05:18

标签: asp.net-mvc viewmodel viewdata

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

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

viewmodel是否应包含下拉列表的列表,还是应该使用ViewData传递下拉列表的数据?

我应该何时使用ViewData,什么时候不应该使用它?

下拉列表等输入字段是否具有单独的视图模型?

5 个答案:

答案 0 :(得分:4)

我倾向于尝试尽可能少地使用ViewData,因为你总是需要转换值,你需要对空值或不存在的键进行错误检查,并且在我看来它会混淆视图。

我倾向于尝试尽可能使用viewmodels,因为我发现强烈地将模型键入视图作为一种更清洁的方法。

我会尽可能多地将数据放入viewmodel,但只有有意义的。对于不应属于viewmodel的数据,我将作为ViewData传入,但会尝试将数量保持在最低限度。

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

答案 1 :(得分:2)

真的是个人选择。 ViewData的缺点是它的类型很弱,需要强制转换。

答案 2 :(得分:2)

您可能需要查看NerdDinner,特别是DinnerFormViewModel和可供选择的国家/地区列表。基本上,他们有一个Dinner模型(用于索引视图,他们需要一个集合)和一个DinnerFormViewModel,它包含一个Dinner实例和一个国家的SelectList。当然,创建视图(恰当地命名为DinnerForm)是强类型的,并采用DinnerFormViewModel。

答案 3 :(得分:2)

我在这里找到了一些非常有趣的东西...... http://weblogs.asp.net/rashid/archive/2009/11/27/extending-asp-net-mvc-2-templates.aspx

正是我需要的。

答案 4 :(得分:1)

您应该将列表作为模型的一部分传递。或者,如果列表非常普遍(例如,状态列表或是/否列表),则可以在静态类中创建静态列表,该列表可以直接在ViewPage中引用。我不明白为什么你想通过ViewData传递它,因为你必须在你的ViewPage中投射你的列表。