最初的情况是我将我的域模型映射到一个表示模型。
我必须显示带有文本框和下拉列表的更新/创建公式。
视图模型应该包含下拉列表的列表,还是应该使用 ViewData 传递下拉列表的数据?
什么时候应该使用 ViewData,什么时候不应该使用它?
像下拉列表这样的输入字段应该有一个单独的视图模型吗?
最初的情况是我将我的域模型映射到一个表示模型。
我必须显示带有文本框和下拉列表的更新/创建公式。
视图模型应该包含下拉列表的列表,还是应该使用 ViewData 传递下拉列表的数据?
什么时候应该使用 ViewData,什么时候不应该使用它?
像下拉列表这样的输入字段应该有一个单独的视图模型吗?
我倾向于尝试尽可能少地使用 ViewData,因为您总是需要转换值,您需要对 null 或不存在的键进行错误检查,并且在我看来它会使视图混乱。
我倾向于尽可能尝试使用视图模型,因为我发现将视图强输入到模型中是一种更简洁的方法。
我会将尽可能多的数据放入视图模型中,但只有有意义的。对于不应属于视图模型的数据,我将作为 ViewData 传入,但会尽量将数量保持在最低限度。
至于输入字段的问题,如果它们都是相关的,我会为此创建一个 ViewModel,而不是在 ViewData 中传递 5 或 10 条数据,因为将它们逻辑分组在一个地方是有意义的。这确实是一个偏好问题,但我发现这种方法对我来说是最好的。
真的是个人选择。ViewData 的缺点是它的类型很弱并且需要强制转换。
您可能想看看NerdDinner,特别是 DinnerFormViewModel 和可供选择的国家/地区列表。基本上,他们有一个 Dinner 模型(用于索引视图,他们需要一个集合)加上一个包含单个 Dinner 实例和国家的 SelectList 的 DinnerFormViewModel。创建视图(恰当地命名为 DinnerForm)当然是强类型的,并采用 DinnerFormViewModel。
我在这里发现了一些非常有趣的东西...... http://weblogs.asp.net/rashid/archive/2009/11/27/extending-asp-net-mvc-2-templates.aspx
正是我需要的。
您应该将列表作为模型的一部分传递。或者,如果列表非常普遍(例如,状态列表或是/否列表),您可以在静态类中创建静态列表,可以直接在 ViewPage 中引用。我不明白您为什么要通过 ViewData 传递它,因为您必须在 ViewPage 中投射您的列表。