在ASP.NET MVC3中,如何使用非常相似但略有不同的视图模型来保持DRY?

时间:2012-01-24 12:53:10

标签: asp.net-mvc-3 viewmodel

在构建应用程序时,我们创建了一个通用对象模型来存储一些值,viewmodel目前看起来有点像这样:

public class FooViewModel {
    public int ID { get; set; }

    public byte FooType { get; set; }

    [Required]
    [Display(Name = "Bar Name")]
    public string Name { get; set; }

    [Required]
    public string Email { get; set; }

    //etc, etc
}

问题是:根据FooType,我们希望显示名称不同,类型1和2不需要电子邮件,但类型3和4需要电子邮件。

我们尝试将每个类型不同的属性分离到继承自此类的类,但验证执行a fallback on what is specified in the base type,因此无效。

目前,唯一的选择似乎是为每个FooType(以及单独的控制器和视图)创建一个viewmodel,这会导致大量的代码重复。

保持这种干燥的其他方法有哪些?

2 个答案:

答案 0 :(得分:1)

为了使验证上下文受益(例如验证不同上下文中的对象),我强烈建议使用FluentValidation库。

答案 1 :(得分:0)

您可以实施自定义RequiredIf validation attribute,也可以实施IValidatableObject