System.ComponentModel.DataAnnotations.compare与System.Web.Mvc.Compare

Sat*_*ies 52 asp.net-mvc-4

升级到.Net 4.5后,MVC 4 Beta项目无法编译.

这是由于和之间的冲突 System.ComponentModel.DataAnnotations.CompareAttribute 而发生的System.Web.Mvc.CompareAttribute

System.ComponentModel.DataAnnotations.CompareAttributeMSDN文档说:

提供比较两个属性的属性.

虽然System.Web.Mvc.CompareAttributeMSDN文档说:

提供比较模型的两个属性的属性.

两者之间有什么区别,什么时候使用它们会"更聪明"?

10X.

Vin*_*lly 38

因此,查看MSDN文档并对两个类进行文字比较,我注意到这两个类都派生自System.ComponentModel.DataAnnotations.ValidationAttribute.事实上,这些类几乎完全相同.唯一值得注意的区别是MVC版本还实现了IClientValidatable,它添加了以下属性:

  • FormatPropertyForClientValidation - (静态成员)通过添加星号和点来格式化用于客户端验证的属性.
  • GetClientValidationRules - 使用指定的模型元数据和控制器上下文获取属性的比较值客户端验证规则列表.

至于您应该使用哪个类,如果模型将直接绑定到视图,请使用MVC版本,以便您可以利用客户端验证.但是,如果您使用的是ViewModel,则可以使用ComponentModel类,并避免额外属性的不必要开销.你的来电!


Wee*_*eej 16

Microsoft Connect解决方法是:

由GavK于2012年6月17日上午5:13发布

我添加了对[System.Web.Mvc.Compare(...)]的完整引用,而不仅仅是使用[Compare(...)]

在VS 2012中为我工作......

  • - 我还是不明白两者之间的主要区别是什么.悠悠球 (3认同)

joe*_*dev 14

Vinney钉住了大部分内容,除了你应该使用哪一个......

在将目标框架更改为4.5之后发生冲突的原因是因为在.NET 4.5之前,System.ComponentModel.DataAnnotations命名空间中没有CompareAttribute类,并且在System.Web.Mvc下定义的类填补了空白.因此,作为一个示例,如果您在更新目标框架之前在模型类中使用[Compare][Required]属性,则在升级时最终会出现冲突.

假设您没有System.Web.Mvc在模型类的命名空间中使用任何其他内容,则应删除该using语句并让它依赖于System.ComponentModel.DataAnnotations命名空间.不引人注意的客户端验证将继续完全像以前一样工作,就像它使用相同的命名空间(例如Required)装饰模型属性的其他属性一样.


Jam*_*ton 6

如果您希望明确参考,可以直接添加以下行:

使用CompareAttribute = System.Web.Mvc.CompareAttribute;