Система.ComponentModel.DataAnnotations.сравните против системы.Сеть.Mvc.Сравнивать
проект MVC 4 Beta не компилируется после обновления до .Net 4.5.
это происходит из-за конфликта между
System.ComponentModel.DataAnnotations.CompareAttribute
и System.Web.Mvc.CompareAttribute
System.ComponentModel.DataAnnotations.CompareAttribute
Примечание говорит:
содержит атрибут, который сравнивает два свойства.
пока System.Web.Mvc.CompareAttribute
Примечание говорит:
содержит атрибут, который сравнивает два свойства модель.
в чем разница между ними и когда было бы "умнее" использовать каждый из них?
10x.
6 ответов:
Итак, глядя на документацию MSDN и делая буквальное сравнение двух классов, я заметил, что оба класса являются производными от System.ComponentModel.DataAnnotations.ValidationAttribute. На самом деле, классы почти точно такие же. Единственное заметное различие заключается в том, что версия MVC также реализует IClientValidatable, который добавляет следующие свойства:
- FormatPropertyForClientValidation - (статический член) форматирует свойство для проверки клиента с помощью добавление звездочки и точки.
- GetClientValidationRules-возвращает список правил проверки клиента сравнения значений для свойства с использованием указанных метаданных модели и контекста контроллера.
Что касается того, какой класс вы должны использовать, если модель будет напрямую привязана к представлению, используйте версию MVC, чтобы вы могли воспользоваться проверкой на стороне клиента. Однако, если вы используете ViewModels, вы можете придерживаться класса ComponentModel и избегать ненужные накладные расходы на дополнительные свойства. Ваш звонок!
Microsoft Connect work-around is:
опубликовано GavK on 17.06.2012 в 5: 13 am
Я добавил полную ссылку на [System.Сеть.Mvc.Сравнение.(..)] вместо того чтобы просто используя [сравнить(...)]
работает для меня в VS 2012...
Винни прибил большую часть из них, за исключением того, который вы должны использовать...
причина, по которой у вас возникает конфликт после изменения целевой платформы на 4.5, заключается в том, что до .NET 4.5 в системе не было класса CompareAttribute.ComponentModel.Пространство имен DataAnnotations и класс, определенный в системе.Сеть.В MVC, заполнила пробел. Поэтому, в качестве примера, если вы используете
[Compare]
и[Required]
атрибуты в классе модели перед обновлением целевого объекта фреймворк вы закончили с конфликтом при обновлении.предполагая, что вы не используете ничего другого в
System.Web.Mvc
пространство имен в вашем классе модели, вы должны удалить этоusing
заявление и пусть оно полагается наSystem.ComponentModel.DataAnnotations
пространство имен. Ненавязчивая проверка на стороне клиента будет продолжать работать точно так же, как и раньше, как и для других атрибутов, которыми вы украшаете свойства своей модели из того же пространства имен (напримерRequired
).
Если вы хотите быть явными о ссылках, вы можете просто добавить эту строку:
с помощью CompareAttribute = System.Сеть.Mvc.CompareAttribute;
использование Visual Studio 2013 (проект MVC 5, .NET 4.5) IntelliSense предполагает, что
System.Web.Mvc.CompareAttribute
и устаревший.Я
System.ComponentModel.DataAnnotations.CompareAttribute
и он отлично работает. Это тоже выполняется ли проверка на стороне клиента!
On этот пост, они также предлагают другое решение, которое заключается в перемещении ссылки на предпочтительное пространство имен для Compare() внутри пространства имен модели. Например. если вы предпочитаете использовать Compare from
System.Web.Mvc
использовать:using System.ComponentModel.DataAnnotations; namespace MyProject.MyViewModel { using System.Web.Mvc;
компилятор сначала будет искать внутри пространства имен модели.