52

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

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

System.ComponentModel.DataAnnotations.CompareAttributeMSDN 文档说:

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

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

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

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

10 倍。

4

6 回答 6

38

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

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

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

于 2012-08-14T21:55:19.243 回答
16

Microsoft Connect 解决方法是:

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

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

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

于 2012-06-27T14:02:51.297 回答
14

除了你应该使用哪一个之外,Vinney 完成了大部分工作......

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

假设您没有System.Web.Mvc在模型类的命名空间中使用任何其他内容,您应该删除该using语句并让它依赖于System.ComponentModel.DataAnnotations命名空间。不显眼的客户端验证将继续像以前一样工作,就像它对您使用来自同一名称空间的其他属性(例如Required)装饰模型的属性所做的那样。

于 2013-08-28T21:29:05.967 回答
6

如果您希望明确引用,您可以简单地添加以下行:

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

于 2013-08-08T16:59:29.300 回答
4

使用 Visual Studio 2013(MVC 5 项目,.NET 4.5),IntelliSense 建议System.Web.Mvc.CompareAttribute弃用

我用过System.ComponentModel.DataAnnotations.CompareAttribute,效果很好。它还进行客户端验证

于 2013-11-29T22:14:29.857 回答
2

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

using System.ComponentModel.DataAnnotations;

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

编译器将首先在模型的命名空间内进行搜索。

于 2013-06-12T14:43:02.390 回答