ASP.NET MVC 2 Проверка числового значения

У меня есть это свойство в классе:

public virtual decimal? Number { get; set; }

Когда я использую его в форме, MVC проверяет его автоматически. Если пользователь вводит букву, естественно возвращается ошибка:

"Значение "D" недопустимо для номера."

Как изменить такое сообщение об ошибке или даже контролировать такое поведение? Я не нахожу связанный атрибут или что-то в этом роде.

Спасибо!


person Joao de Araujo    schedule 14.09.2010    source источник


Ответы (2)


На самом деле это не сообщение, полученное в результате проверки модели. Сообщение добавляется в состояние модели, когда средство связывания модели не может преобразовать входное значение в тип значения связанного свойства. Например, это может произойти, когда связанное свойство является целым числом, а пользователь ввел нечисловой символ в поле ввода этого свойства.

Чтобы переопределить сообщение, вам, к сожалению, придется сделать это «жестким» способом, то есть расширить класс DefaultModelBinder и переопределить метод SetProperty. Вот пример:

public class MyModelBinder: DefaultModelBinder
{
    public MyModelBinder()
    {
    }

    protected override void SetProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, object value)
    {
        string key = bindingContext.ModelName + "." + propertyDescriptor.Name;
        if (bindingContext.ModelState[key] != null)
        {

            foreach (ModelError error in bindingContext.ModelState[key].Errors)
            {
                if (IsFormatException(error.Exception))
                {
                    bindingContext.ModelState[key].Errors.Remove(error);
                    bindingContext.ModelState[key].Errors.Add(string.Format("My message for {0}.", propertyDescriptor.DisplayName));
                    break;
                }
            }
        }
        base.SetProperty(controllerContext, bindingContext, propertyDescriptor, value);
    }

    private bool IsFormatException(Exception e)
    {
        while (e != null)
        {
            if (e is FormatException)
            {
                return true;
            }
            e = e.InnerException;
        }
        return false;
    }
}
person jhdrn    schedule 28.10.2010

просто используйте данный диапазон валидатора, и вы получите то, что хотите

Для проверки любого числа вы должны использовать другую проверку диапазона в соответствии с вашими требованиями:

Для целого числа

[Range(0, int.MaxValue, ErrorMessage = "Please enter valid integer Number")]

для поплавка

[Range(0, float.MaxValue, ErrorMessage = "Please enter valid float Number")]

для двоих

[Range(0, double.MaxValue, ErrorMessage = "Please enter valid doubleNumber")]
person Dilip0165    schedule 18.06.2013
comment
@fedorui спасибо за редактирование. Будет более понятно. а полезно или нет? - person Dilip0165; 27.06.2013