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

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

这是由于System.ComponentModel.DataAnnotations.CompareAttributeSystem.Web.Mvc.CompareAttribute之间的冲突

System.ComponentModel.DataAnnotations.CompareAttribute MSDN文档说:

提供一个比较两个属性的属性。

虽然System.Web.Mvc.CompareAttribute MSDN文档说:

提供一个比较模型的两个属性的属性。

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

10X。

所以,看MSDN文档,并做两个类的字面比较,我注意到这两个类都派生自System.ComponentModel.DataAnnotations.ValidationAttribute。 事实上,这些课程几乎完全一样。 唯一不同的是,MVC版本还实现了IClientValidatable,它增加了以下属性:

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

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

  • System.Web.Mvc.CompareAttribute

  • System.ComponentModel.DataAnnotations.CompareAttribute

Microsoft Connect解决方法是:

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

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

在VS 2012中为我工作…

Vinney钉了大部分,除了你应该使用的一个例外…

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

假设你没有在模型类的System.Web.Mvc命名空间中使用其他任何东西,你应该删除using语句并让它依赖于System.ComponentModel.DataAnnotations命名空间。 不显眼的客户端validation将继续像以前一样工作,就像它为其他属性一样,使用相同的名称空间(例如Required )来修饰模型的属性。

如果你想明确的参考,你可以简单地添加这一行:

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

使用Visual Studio 2013(MVC 5项目,.NET 4.5),IntelliSense表明System.Web.Mvc.CompareAttribute已被弃用

我用System.ComponentModel.DataAnnotations.CompareAttribute ,它工作正常。 它也做客户端validation

在这篇文章中 ,他们还提出了另一种解决scheme,即在模型名称空间内移动Compare()的首选名称空间的引用。 例如。 如果您喜欢使用System.Web.Mvc Compare,请使用:

 using System.ComponentModel.DataAnnotations; namespace MyProject.MyViewModel { using System.Web.Mvc; 

编译器将首先在模型的名字空间内进行search。