假设你想开发你的控制器(Controller),使其使用ViewModel来包含Views所需渲染的数据,那么是否所有的数据都应该包含在ViewModel中?在什么条件下可以绕过ViewModel?
我提出这个问题是因为我处于这样一个位置:一些代码正在使用ViewData,而另一些则使用ViewModel。我希望向团队分发一组指南,以便他们知道何时使用ViewData,在何时使用ViewModel只是为了节省时间。我希望得到其他开发人员的意见,以确保我的指南不仅仅是出于个人偏见。
假设你想开发你的控制器(Controller),使其使用ViewModel来包含Views所需渲染的数据,那么是否所有的数据都应该包含在ViewModel中?在什么条件下可以绕过ViewModel?
我提出这个问题是因为我处于这样一个位置:一些代码正在使用ViewData,而另一些则使用ViewModel。我希望向团队分发一组指南,以便他们知道何时使用ViewData,在何时使用ViewModel只是为了节省时间。我希望得到其他开发人员的意见,以确保我的指南不仅仅是出于个人偏见。
ViewData[ViewDataKeys.MyKey] = myvalue;
事实上,我将其用于几乎任何需要“基于字符串”的内容(Session Keys、Cache Keys、VaryByCustom输出缓存键等)。当您的视图变得更加复杂时,您可能希望考虑一种方法,即仅将模型用于输入字段,并使用ViewData支持视图需要呈现的其他内容。
至少有几个观点支持这种做法:
您拥有一个主页面,需要存在某些数据(例如标题中的类似StackOverflow用户信息的东西)。应用站点范围内的ActionFilter使得在每个操作后填充ViewData中的信息变得容易。如果将其放入模型中,则需要使站点中的每个其他模型都继承自基本模型(最初可能看起来不错,但很快就会变得复杂)。
当您验证已发布的表单时,如果存在验证错误,则可能需要将模型重新绑定(包括无效字段)回到视图并显示验证消息。这是可以接受的,因为输入字段中的数据会被发布并绑定到模型上,但是视图需要重新填充的任何其他数据呢?(例如下拉列表值、信息消息等)这些将不会被发布,而且在“周围”发布的输入值周围重新填充这些数据可能会变得混乱。通常更简单的方法是编写一个方法,该方法使用ViewData填充..视图数据。
根据我的经验,我发现这种方法很有效。
而在MVC3中,动态视图模型意味着不再需要使用字符串索引了!