2011-06-17 77 views
5

我想知道是不是很好的做法,试图使一个视图,在一个通用的视图模型?通用查看模型?

我想知道这是因为有人提到他期望不得不做大量的重复代码,除非他开始制作通用视图和通用视图模型。

所以基本上这些意见就像是一组控件。一个视图可能有2个控件(比如文本框和单选按钮),另一个视图可能有50个控件。

它们都具有相同的外观和感觉(它只是通过控件的数量而增长)。基本上他认为有一个视图模型接受对象(域对象)查看它并查看50个字段并呈现正确的控件类型。

我想一个编辑模板可以用来找出控制,但我只是没有出售一般视图模型。

我喜欢泛型,他们可以做非常强大的事情,在某些情况下他们是好的,但我只是不全面地疯狂他们,并尝试不使用。

我发现大部分时间可以减少重复的代码,但有时会使代码变得更加复杂。当然,这可能仅仅是因为我对编程还比较陌生,它可能仍然超出我的技能水平。

我对它的下一个问题是我认为视图模型应该尽可能平坦,并且只公开实际将要使用的数据,以便人们不会开始使用应该从未出现在视图中的属性第一个地方。

我接下来的问题是,如果您有一些复杂的对象,其中有对象的对象,它可能会继续前进。它可能会持续很长时间。

+0

[请看看我的代码,我试图实现类似的东西](https://stackoverflow.com/questions/48750809/generic-view-in-asp-net-core-2-0-using- lambda表达式) – Omar

回答

3

我没有看到任何错误的泛型ViewModels。这是删除重复并保留编译时检查的好方法,与ViewBag相反。

实施例:

假设你有一组模型类为ProductCategory等 每个类(ProductModelCategoryModel)具有相关联的显示和编辑模板,其产生相应的视图。

现在你想构建一组页面进行查看和编辑。

我通常会创建一个布局(母版页的网页形式)呈现共同的内容(页眉,页脚,菜单等)

然后我会创建一个接受的模型ProductViewModel个人,强类型的意见,CategoryViewModel

现在我们需要定义这些视图模型类。每个视图模型类应该采用ProductModel,CategoryModel等实例(将传递给模板)。但布局通常需要一些额外的数据(即所选菜单,登录用户名等)。我的解决方案是创建一个通用的视图模型封装此重复数据的布局:

public class EntityViewModel<T> 
    where T : EntityModel 
{ 
    public T Entity { get; set; } 
    public string UserName { get; set; } 
    public string SelectedMenu { get; set; } 
} 

然后你就可以很容易地创建一个ProductViewModel : EntityViewModel<ProductModel>,其中包含的一切布局需要渲染页面,您可以添加有任何附加,产品特定的数据。

+0

@ Jakub Konecki - 你能举一个例子吗?我希望至少看到一个,看看它会如何(也许它完全不同,然后我会这样) – chobo2

+0

所以实体现在是ProductModel或CategoryModel还是它是ProductViewModel和CategoryViewModel? – chobo2

+0

@ chobo2 - 正如您在最后一句'ProductModel:EntityModel'中看到的一样。 –

1

就ViewModel而言,我通常会将所有ViewModel从BaseViewModel继承,这些BaseViewModel公开了有助于实现MVVM的方法。如果您想查看示例,请在下面评论。

+0

?嗯,我也会对看到这个例子感兴趣。 –

+0

很想看到一个例子。我对这种模式并不熟悉。 – chobo2

+0

乍一看,我没有看到asp.net标签,我以为你使用的是像Silverlight而不是MVC的MVVM。 MVC中有“视图模型”吗?我通常只是将视图和模型看作单独的实体。 – NickHeidke

5

个人而言,我避免在视图模型中使用泛型。我同意你们中的大多数对他们提出的理由,特别是这一个:

下一个问题,我与它是我 认为视图模型应尽可能 平越好,只公开数据 即究竟要使用这样 人们不开始使用性质 应该从来没有在视图中 首位

背后视图模型的想法是,他们需要专门绑的要求一个给定的观点,而不是他们一般(/通用)作为你的领域模型。我更喜欢在视图模型中重复使用代码,而不是在视图和部分中重复使用一些通用的怪物。

即使在您需要generate dynamic forms and controls的情况下,您也不需要使用通用视图模型。因此,除非你有一些特定的超特定场景(目前无法想象),否则在视图模型中避免泛型可能是件好事。

这就是说,不要完全排除它们,如果您觉得存在一种通用视图模型可能有用的情况,请毫不犹豫地在此处展示它,方法是解释场景并显示所有代码以便我们可以讨论它。

+0

我发现搜索的唯一原因是有些人说他喜欢200个物品或者其他类似的东西,并且不想制作200个独立的视图模型,我猜的看法。我不确定在这种情况下我会做什么。另一个我忘记补充的是数据注释验证。我猜你可能必须将其放在域对象上,我认为这是另一个禁忌。 http://stackoverflow.com/questions/2138951/asp-net-mvc-generic-view-for-displaying-data-海报不提及查看模型,但我认为他可能正在使用它们 – chobo2

+0

@Darin Dimitrov我是使用视图模型仅用于将视图中的数据传递给控制器​​,而不是反之。还有它的页面编号,页面大小,搜索过滤器等,用于阅读,不需要添加/编辑/删除操作。一些控制器需要额外的参数,如ProductCategoryId。我是否应该在具有额外字段的新ViewModel中使用继承或重复代码? – user2330678

0

我真的不喜欢在viewmodel里面放置业务逻辑。我认为,除了构造函数内部的常规属性和错误处理,任何东西都不应该在视图模型中。它使得代码更简洁,并且可以更自由地添加查看模型。 如果您需要复制很多代码,您可以将其隔离为独立的viewmodel,然后将其嵌套到需要的位置。 这样你也只有你需要的视图。

+1

我没有看到任何关于在ViewModel中包含逻辑的问题。 –