Как я могу удалить сообщения проверки MVC2?

Я использую ASP.NET C # MVC2, и у меня есть следующее поле в модели со следующими атрибутами проверки аннотации данных:

[DisplayName("My Custom Field")]
[Range(long.MinValue, long.MaxValue, ErrorMessage = "The stated My Custom Field value is invalid!")]
public long? MyCustomField{ get; set; }

В форме это поле должно позволять пользователю оставлять его пустым и отображать сообщение проверки, если пользователь попытается ввести значение, которое не может быть выражено числом. С точки зрения проверки, это работает как задумано и отображает следующие сообщения об ошибках:

Указанное значение My Custom Field недействительно!

Поле «Мое настраиваемое поле» должно быть числом.

Первое сообщение проверки - это написанное мной настраиваемое сообщение проверки, а второе сообщение проверки - это сообщение, которое MVC2 автоматически генерирует. Мне нужно избавиться от второго, так как он лишний. Как мне это сделать? На мой взгляд, у меня следующая разметка

<% Html.EnableClientValidation(); %>
<% using (Html.BeginForm())
   { %>
   <%:Html.ValidationSummary(false)%>
   <% Html.ValidateFor(m => m.MyCustomField); %>

person William Calleja    schedule 16.05.2012    source источник


Ответы (1)


Эта проблема возникает из-за того, что привязанное свойство является числовым, а привязка модели автоматически обрабатывает тот факт, что строка не может быть преобразована в число. Это не RangeAttribute дело.

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

Затем у вас есть существующее свойство, которое обертывает эту строку:

 [DisplayName("My Custom Field")]
 [MyCustomRangeAttribute(/* blah */)] //<-- the new range attribute you write
 public string MyCustomFieldString
 {
   get; set;
 }

 public int? MyCustomField
 {
   get 
   { 
     if(string.IsNullOrWhiteSpace(MyCustomField))
       return null;
     int result;
     if(int.TryParse(MyCustomField, out result))
       return result;
     return null;
   }    
   set
   {
      MyCustomFieldString = value != null ? value.Value.ToString() : null;
   }
 }

Ваш код может продолжать успешно работать со свойством int?, но - вся привязка модели выполняется к свойству string.

В идеале вы также должны добавить [Bind(Exclude"MyCustomField")] к типу модели - чтобы гарантировать, что MVC не пытается привязать поле int?. Или вы можете просто сделать это internal. Если он находится в веб-проекте, и вам нужно только сослаться на него в веб-проекте.

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

person Andras Zoltan    schedule 16.05.2012
comment
Привет, Андрас, спасибо за предложения. Я знал об использовании строки в качестве типа данных, но в этом случае мне действительно нужно сохранить тип данных как есть, и я не могу использовать хакерские методы. Это решение мне нужно применить в большом проекте, который потребует постоянной поддержки. - person William Calleja; 16.05.2012
comment
К сожалению, тогда вам придется пересмотреть DefaultModelBinder - поскольку я считаю, что именно отсюда возникает сообщение проверки. Вы говорите, что его действительно нужно сохранить как int; но по моему опыту вы должны быть готовы быть более гибкими в отношении типов ваших моделей; если вы не хотите писать много собственного кода. В любом случае - с моим обновленным кодом вы даже не заметите разницы на бэкэнде ... - person Andras Zoltan; 16.05.2012
comment
@WilliamCalleja, извините, я написал свой комментарий перед обновлением кода, думая, что буду быстро ... Сейчас он обновлен. Хотя, боюсь, ответ не изменился. - person Andras Zoltan; 16.05.2012