System.ComponentModel.DataAnnotations.compare vs System.Web.Mvc.Compare
升级到.Net 4.5后,MVC 4 Beta项目无法编译。
这是由于System.ComponentModel.DataAnnotations.CompareAttribute
和System.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。