我经常需要将“复杂的”数据传递给我的视图:不同的数据库对象、类等等。我厌倦了创建许多像这样的类助手。
class StatsPageViewData
{
public User User { get; set; }
public Something Something { get; set }
// blah blah
}当然,我不能只使用ViewData的“something”,它就是不太舒服。
所以我的问题是,有没有办法让这个过程变得更容易,以某种方式使其自动化?
发布于 2010-07-05 01:38:21
视图模型很少应该只是一个域类的集合。首先,将域类放入视图模型是一个很大的话题;许多人认为您不应该这样做。您的视图可能不需要完整的用户实例,只需要一个名称。如果您在视图模型中保留完整的用户实例,则会隐藏真实视图模型的意图,使其难以重用,等等。您最好使用string UserName属性来正确格式化名称,而不是访问视图中的用户属性并在视图中对其进行格式化。
这是一个理论,没有人的有来遵循它;但保留在内存中并尝试实现它是很好的。
其次,视图模型不应该仅仅是域类的集合,因为它们应该提供视图语义--例如,验证属性和其他表示逻辑。您可以使用聚合属性来提供选择列表的数据、格式等。另一个例子是,POST视图模型可以具有将原始表单数据转换为实体的方法。
您应该将一些表示逻辑从视图和/或控制器移到视图模型中-格式化、仅由视图需要的属性,等等。控制器不应该将实体集合转换为视图模型数据集合-视图模型应该这样做。视图不应将格式用户转换为单一名称和地址字符串-视图模型应转换。
这样做,您就不会厌倦创建“视图模型”类,因为它们不再是愚蠢的,您的工作也不会是转储和/或重复的。视图模型类与应用程序中的其他类一样重要。
发布于 2010-07-04 21:11:42
使用诸如ReSharper之类的插件来帮助您创建这些帮助程序类。
首先使用类和属性。这将在编辑器中将它们标记为缺失,然后您可以使用插件来创建类和属性,从而使帮助器类的创建速度比反过来快得多。
发布于 2010-07-04 21:14:37
我认为model-per-view模式是一种最佳实践。您可以尝试在可能的情况下使用继承和组合来共享模型组件(保持代码干燥),但我在这方面也只取得了有限的成功。要使视图模型到业务模型的转换变得更容易,您可以尝试使用AutoMapper之类的工具。我对唯一一个能从中受益的大项目太过投入,无法应用它,但我一直在寻找一些东西来简化这个过程。
https://stackoverflow.com/questions/3174758
复制相似问题