最初的情况是我将我的领域模型映射到演示模型。
我必须显示一个带有文本框和下拉列表的更新/创建表单。
视图模型应该包含下拉列表的列表还是应该使用ViewData传递下拉列表的数据?
何时应该使用ViewData,何时不应该使用它?
像下拉列表这样的输入字段是否应该有单独的视图模型?
最初的情况是我将我的领域模型映射到演示模型。
我必须显示一个带有文本框和下拉列表的更新/创建表单。
视图模型应该包含下拉列表的列表还是应该使用ViewData传递下拉列表的数据?
何时应该使用ViewData,何时不应该使用它?
像下拉列表这样的输入字段是否应该有单独的视图模型?
我倾向于尽可能少地使用ViewData,因为您总是需要转换值,需要检查null或不存在的键,并且在我看来它会使视图混乱。
我倾向于尽可能使用viewmodel,因为我发现将视图强类型化到模型是一种更清晰的方法。
我会尽可能将数据放入viewmodel中,但仅限于有意义的数据。对于不应该属于viewmodel的数据,我会将其作为ViewData传递,但会尽量保持数量最少。
至于您关于输入字段的问题,如果它们都相关,则应创建一个ViewModel,而不是在ViewData中传递5或10个数据,因为在一个地方逻辑上将它们分组是有意义的。这确实是一种偏好,但我发现这种方法对我来说是最好的。
这真的是个人选择。ViewData 的缺点是它弱类型并且需要转换。
你可能想要查看 NerdDinner,特别是 DinnerFormViewModel 和国家选择列表。基本上,他们有一个 Dinner 模型(用于索引视图,需要一个集合),以及一个包含单个 Dinner 实例和 SelectList 的 DinnerFormViewModel。创建视图(适当地命名为 DinnerForm)当然是强类型的,并且接受一个 DinnerFormViewModel。
你应该将列表作为模型的一部分传递。或者,如果列表非常普遍(比如说州列表或是一个是/否列表),你可以在静态类中创建一个静态列表,直接在你的视图页面中引用它。我不明白为什么你想通过ViewData传递它,因为你需要在视图页面中转换你的列表。
Options<UserType>
将被填充为所有UserTypes的列表。 - Ryan