2012-05-16 4 views
3

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

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

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

Указанное значение моего пользовательского поля недействительно!

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

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

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

ответ

2

Этот вопрос вы здесь потому, что свойство привязки является числовой, и модель привязки автоматической обработки тот факт, что строка не может быть преобразована в число. Дело не в 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? собственности вполне счастливо, но - все модели связывания делается на свойства строки.

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

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

+0

Hi Андраш, спасибо за предложения. Я знал об использовании строки в качестве типа данных, но в этом случае мне действительно нужно сохранить тип данных как есть, и я не могу использовать хакерские методы. Это решение мне нужно применить к большому проекту, который потребует постоянной поддержки. –

+0

К сожалению, вам придется взглянуть на повторную работу «DefaultModelBinder» - так как я считаю, что это сообщение об ошибке проверки. Вы говорите, что это действительно нужно хранить как 'int'; но, по моему опыту, вы должны быть более гибкими в своих типах моделей; если вы не хотите писать много настраиваемого кода. Во всяком случае - с моим обновленным кодом вы даже не заметите разницы на заднем плане ... –

+0

@WilliamCalleja жаль, что я написал свой комментарий перед обновлением кода, думая, что буду быстро ... Он обновляется. Не менялся ответ, хотя я боюсь. –

Смежные вопросы