ASP.Net MVC2使用DataAnnotations以不同方式验证同一类的两个ViewModel

时间:2011-01-08 11:05:21

标签: asp.net-mvc-2 validation inheritance data-annotations

我正在使用DataAnnotations来验证自定义类(LINQ to SQL自动生成),使用类顶部的MetadataType标记。我喜欢DataAnnotations,它在简单的常见场景中运行良好。 E.g。

[MetadataType(typeof(Person_Validation))]
public class Person

但是,如果你需要在不同场景中将两套不同的验证规则应用于该类,那该怎么办?

我的情况:某些字段在www面向公众的网站上是必填字段,但在内部管理网站上不是强制性的。但是这两个站点都有一个View,它创建了同一个对象/类的“New”。

这就是DataAnnotations HELL表面的地方..

我尝试使用两个不同的ViewModel,每个ViewModel都应用了不同的验证,两个继承自Person的类,每个类都应用了不同的验证。但是所有道路似乎都与DRY原则发生冲突,你最终会在某条线上完全重新指定基础类结构的所有属性。只有一个验证规则集时,您不必执行此操作。所以它很快就变成了地狱而不适用于复杂的物体。

这是否可以使用DataAnnotations以及什么是最好的DRY架构?

1 个答案:

答案 0 :(得分:1)

不确定你的意思是'在原始基础类中手动复制并手动设置每个属性'。我从来不喜欢好友课程的想法,并且会亲自为Admin和Public网站推荐不同的视图模型(每个视图都有相应的验证集),然后使用AutoMapper在模型之间进行映射。

更新:

Regading Automapper,基本用法是这样的:

  • 首先,您必须定义映射。这让automapper预先弄清楚如何映射对象。您只需要在应用程序中执行一次,因此在ASP.NET应用程序中执行此操作的好地方是Global.asax中的Application_Start()。对于要在其间进行映射的每对课程,请致电:Mapper.CreateMap<SourceType, DestinationType>();

  • 然后,在您的应用程序代码中执行地图,您只需使用:

var destinationObject = Mapper.Map<SourceType, DestinationType>(sourceOjbect);