Система.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 52

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;

компилятор сначала будет искать внутри пространства имен модели.