如何使用asp.net mvc视图模型和数据注释属性保持DRY?

Jim*_*rts 13 asp.net-mvc

如何使用Asp.Net MVC保持带有asp.net mvc视图模型和数据注释(验证,显示和数据建模)属性的DRY?我已将模型对象以及特定于操作的视图模型传递给视图.我发现两个方向都有一些问题,试图保持干燥.

  • 使用模型对象作为视图模型: 这在简单的情况下工作正常,并允许您只在每个模型对象上编写一次数据注释属性.当您具有需要多个对象类型的复杂视图时,会出现问题.生成的视图模型体系结构是使用视图模型类和实际模型类的混合体.此外,此方法可以将模型属性公开给您不想要的视图.

  • 每个操作使用唯一的视图模型类: 视图模型类仅包含视图特定属性,使用数据注释属性进行修饰.根据我的经验,这种方法并没有被证明是非常干燥的,因为数据注释属性往往在视图模型类中重复.例如,New和Edit视图模型共享很多(但不是全部)属性和数据注释.

如何使用asp.net mvc视图模型和数据注释属性保持DRY?

CGK*_*CGK 5

一个很好的选择是从DataAnnotations切换到Fluent Validation。它使您可以将通用的验证逻辑封装在一个类中,以后可以将其应用于模型。

文档中

[Validator(typeof(PersonValidator))]
public class Person {
    public int Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public int Age { get; set; }
}

public class PersonValidator : AbstractValidator<Person> {
    public PersonValidator() {
        RuleFor(x => x.Id).NotNull();
        RuleFor(x => x.Name).Length(0, 10);
        RuleFor(x => x.Email).EmailAddress();
        RuleFor(x => x.Age).InclusiveBetween(18, 60);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这绝对是一个有吸引力的选择,但对于这个特定问题并没有真正的帮助。除非我错过了什么 (2认同)

Jim*_*rts 0

到目前为止,我发现使用继承来组合共享属性效果最好。我对每个操作使用一个独特的视图类,并且对到目前为止的解决方案非常满意。它并不能解决 100% 的情况,但它确实涵盖了大多数情况,并且几乎消除了重复的数据契约属性。