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

前端 未结 6 1856
星月不相逢
星月不相逢 2020-12-24 04:44

MVC 4 Beta project fails to compile after upgrading to .Net 4.5.

This happens due to conflict between System.ComponentModel.DataAnnotations.CompareAttribute

相关标签:
6条回答
  • 2020-12-24 05:34

    So, looking at the MSDN documentation and doing a literal comparison of the two classes, I noticed both classes are derived from System.ComponentModel.DataAnnotations.ValidationAttribute. In fact, the classes are almost exactly the same. The only notable difference is that the MVC version also implements IClientValidatable which adds the following properties:

    • FormatPropertyForClientValidation - (static member) Formats the property for client validation by prepending an asterisk and a dot.
    • GetClientValidationRules - Gets a list of compare-value client validation rules for the property using the specified model metadata and controller context.

    As for which class you should use, if the model will be directly bound to a view, use the MVC version so that you can take advantage of the client-side validation. However, if you're using ViewModels, you can stick with the ComponentModel class and avoid the unnecessary overhead of the additional properties. Your call!

    • System.Web.Mvc.CompareAttribute

    • System.ComponentModel.DataAnnotations.CompareAttribute

    0 讨论(0)
  • 2020-12-24 05:34

    Microsoft Connect work-around is:

    Posted by GavK on 6/17/2012 at 5:13 AM

    I added a full reference to [System.Web.Mvc.Compare(...)] rather than just using [Compare(...)]

    Works for me in VS 2012...

    0 讨论(0)
  • 2020-12-24 05:34

    On this post, they also suggest another solution, which is to move the reference of the preferred namespace for Compare() inside the model's namespace. Eg. if you prefer to use Compare from System.Web.Mvc, use:

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

    The compiler will search inside the model's namespace first.

    0 讨论(0)
  • 2020-12-24 05:39

    If you wish to be explicit about the reference, you can simply add this line:

    using CompareAttribute = System.Web.Mvc.CompareAttribute;

    0 讨论(0)
  • 2020-12-24 05:39

    Using Visual Studio 2013 (MVC 5 project, .NET 4.5) the IntelliSense suggests that System.Web.Mvc.CompareAttribute is deprecated.

    I used System.ComponentModel.DataAnnotations.CompareAttribute and it works fine. It also does the client-side validation!

    0 讨论(0)
  • 2020-12-24 05:44

    Vinney nailed most of it with the exception of which one you should use...

    The reason you have a conflict after changing your target framework to 4.5 is because prior to .NET 4.5 there was no CompareAttribute class in the System.ComponentModel.DataAnnotations namespace and the class defined under System.Web.Mvc filled the gap. Therefore, as an example if you were using [Compare] and [Required] attributes in your model class prior to updating your target framework you ended up with a conflict when you upgraded.

    Assuming you are not using anything else in the System.Web.Mvc namespace in your model class, you should remove that using statement and let it rely on the System.ComponentModel.DataAnnotations namespace. Unobtrusive client-side validation will continue to work exactly as it did before, just as it does for other attributes that you decorate your model's properties with from the same namespace (eg Required).

    0 讨论(0)
提交回复
热议问题