Подтвердить что ты не робот

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

Проект MVC 4 Beta не может скомпилироваться после обновления до .Net 4.5.

Это происходит из-за конфликта между System.ComponentModel.DataAnnotations.CompareAttribute и System.Web.Mvc.CompareAttribute

System.ComponentModel.DataAnnotations.CompareAttribute Документация MSDN говорит:

Предоставляет атрибут, который сравнивает два свойства.

Пока System.Web.Mvc.CompareAttribute Документация MSDN говорит:

Предоставляет атрибут, который сравнивает два свойства модели.

В чем разница между ними и когда "умнее" использовать каждый из них?

10x.

4b9b3361

Ответ 1

Итак, глядя на документацию MSDN и выполняя буквальное сравнение двух классов, я заметил, что оба класса получены из System.ComponentModel.DataAnnotations.ValidationAttribute. На самом деле классы почти одинаковы. Единственная заметная разница заключается в том, что версия MVC также реализует IClientValidatable, которая добавляет следующие свойства:

  • FormatPropertyForClientValidation - (статический член) Форматирует свойство для проверки клиента, добавляя звездочку и точку.
  • GetClientValidationRules - Получает список правил проверки клиента для сравнения значений для свойства с использованием указанных метаданных модели и контекста контроллера.

Что касается того класса, который вы должны использовать, если модель будет напрямую привязана к представлению, используйте версию MVC, чтобы вы могли воспользоваться проверкой на стороне клиента. Однако, если вы используете ViewModels, вы можете придерживаться класса ComponentModel и избегать ненужных накладных расходов дополнительных свойств. Ваш звонок!

Ответ 2

Работа Microsoft Connect:

Отправленный GavK 17/7/2012 в 5:13 утра

Я добавил полную ссылку на [System.Web.Mvc.Compare(...)], а не просто используя [Compare (...)]

Работает для меня в VS 2012...

Ответ 3

Винни прибил большую часть его, за исключением того, который вы должны использовать...

Причина, по которой у вас возник конфликт после изменения целевой платформы до 4.5, заключается в том, что до .NET 4.5 не было класса CompareAttribute в пространстве имен System.ComponentModel.DataAnnotations и класс, определенный в System.Web.Mvc, заполнил пробел. Поэтому в качестве примера, если вы использовали атрибуты [Compare] и [Required] в своем классе модели до обновления целевой среды, вы столкнулись с конфликтом при обновлении.

Предполагая, что вы не используете что-либо еще в пространстве имен System.Web.Mvc в вашем классе модели, вы должны удалить этот оператор using и позволить ему полагаться на пространство имен System.ComponentModel.DataAnnotations. Ненавязчивая проверка на стороне клиента будет продолжать работать точно так же, как и раньше, так же, как и для других атрибутов, которые вы украшаете своими свойствами модели из одного и того же пространства имен (например, Required).

Ответ 4

Если вы хотите явно указать ссылку, вы можете просто добавить эту строку:

используя CompareAttribute = System.Web.Mvc.CompareAttribute;

Ответ 5

Используя Visual Studio 2013 (проект MVC 5,.NET 4.5), IntelliSense предлагает, чтобы System.Web.Mvc.CompareAttribute устарел.

Я использовал System.ComponentModel.DataAnnotations.CompareAttribute, и он отлично работает. Он также выполняет проверку на стороне клиента!

Ответ 6

В этот пост, они также предлагают другое решение, которое должно переместить ссылку предпочтительного пространства имен для Compare() внутри пространства имен модели, Например. если вы предпочитаете использовать Compare from System.Web.Mvc, используйте:

using System.ComponentModel.DataAnnotations;

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

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