2010-06-19 81 views
4

最初的情况是我将我的领域模型映射到演示模型。ASP.NET MVC ViewData和视图模型最佳实践

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

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

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

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

回答

4

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

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

我会将尽可能多的数据放入视图模型中,但只有有意义。对于不应该属于视图模型的数据,我会以ViewData形式传入,但会尽量减少数量。

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

2

真是个人选择。 ViewData的缺点是输入较弱,需要投射。

1

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

+0

http://weblogs.asp.net/rashid/archive/2009/11/27/extending-asp-net-mvc-2-templates.aspx – Rookian 2010-06-22 15:34:16

2

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

2

我发现了一些很有趣的在这里... http://weblogs.asp.net/rashid/archive/2009/11/27/extending-asp-net-mvc-2-templates.aspx

正是我需要的。

+1

我走得更远一步。我没有在控制器中设置ViewData字段,而是使用ActionFilter在我的模型上查找空选项列表,并根据泛型自动填充它们。 (如果你有一些视图特定的逻辑来显示什么选项,这是行不通的。)例如'选项'将被填充所有用户类型的列表。 – Ryan 2010-06-22 16:41:56

+0

此答案中的链接已损坏。 – PixelPlex 2017-05-01 12:14:24