通用视图模型?

cho*_*bo2 5 c# asp.net-mvc viewmodel asp.net-mvc-3

我想知道尝试制作一个采用通用视图模型的视图是一种好习惯吗?

我想知道这是因为有人提到他预计必须做很多重复的代码,除非他开始制作通用视图和通用视图模型.

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

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

我猜一个编辑模板可以用来找出控件,但我不是在通用视图模型上出售.

我喜欢泛型,他们可以做非常强大的事情,在某些情况下,他们很好,但我不是总体上对他们疯狂,并试图不使用.

我发现大多数时候它可以减少重复的代码,但有时它会使代码变得更复杂.当然这可能只是因为我仍然是一个相对较新的编程,它可能仍然高于我的技能水平.

我遇到的下一个问题是我认为视图模型应该尽可能平坦,并且只暴露实际将要使用的数据,这样人们就不会开始使用从未在视图中出现过的属性.

我遇到的下一个问题是,如果你有一些复杂的对象,其中包含有对象的对象,它可以继续前进.它可能会持续很长时间.

Dar*_*rov 5

我个人避免在视图模型中使用泛型.我同意你提到的针对他们的大部分理由,尤其是这一理由:

我遇到的下一个问题是我认为视图模型应尽可能平坦,只暴露实际将要使用的数据,这样人们就不会开始使用从未在视图中出现的属性

视图模型背后的想法是,它们需要特定地与给定视图的要求相关联,而不是像领域模型那样使它们成为通用(/通用).我更喜欢在视图模型中复制代码,而不是在视图和部分中重复使用一些通用怪物.

即使在需要生成动态表单和控件的情况下,也不需要使用通用视图模型.

因此,除非你有一些特定于超级特定的场景(目前无法想到任何场景),否则在视图模型中避免使用泛型可能是件好事.

这就是说,不要完全排除它们,如果你觉得通用视图模型有用的情况可以毫不犹豫地在这里展示,通过解释场景并显示所有代码以便我们可以讨论一下.


Jak*_*cki 3

我不认为通用 ViewModel 有什么问题。与 ViewBag 不同,这是消除重复并保留编译时检查的好方法。

例子:

想象一下,您有一组用于ProductCategory等的模型类。每个类 ( ProductModelCategoryModel) 都有一个关联的显示和编辑器模板,用于生成适当的视图。

现在您想要构建一组页面以供查看和编辑。

我通常创建一个布局(Web 表单中的母版页)来呈现常见内容(页眉、页脚、菜单等)

然后我会创建单独的强类型视图,接受 model ProductViewModelCategoryViewModel等。

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

public class EntityViewModel<T>
    where T : EntityModel
{
    public T Entity { get; set; }
    public string UserName { get; set; }
    public string SelectedMenu { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以轻松创建一个ProductViewModel : EntityViewModel<ProductModel>,其中包含布局呈现页面所需的所有内容,并且您可以在其中添加任何其他特定于产品的数据。