Здесь есть два этапа проверки.
Перед вызовом проверки, установленной в ваших атрибутах, платформа сначала пытается проанализировать информацию.
Итак, вот несколько примеров, основанных на этом коде:
[Range(0, Int32.MaxValue, ErrorMessage="Invalid Number")]
public int? Number { get; set; }
Я ничего не набираю в поле ...
«Неверное число» (Framework создаст нулевое целое число, правило проверки не выполнено)
Я набираю «А» в поле ...
"Значение 'A' недопустимо для Number." (Framework не может преобразовать «A» в обнуляемое int, поэтому правило проверки структуры не выполняется и ваше правило проверки не проверено.
** Решения **
1 - Живите с сообщением по умолчанию, пока вы не используете MVC 3 / .NET 4, что упрощает переопределение этих сообщений
2 - исключить значение из подшивки, чтобы оно не вызывало ошибки (но вам придется связать его и проверить самостоятельно)
[Bind(Exclude="MyNumber")]
3 - Создайте строку в модели, затем протестируйте ее с помощью TryParse и добавьте свою собственную ошибку пользовательской модели (Это разумная практика и напоминает нам всем, почему используются View View Modeles, а не Domain Objects!)
if (!Int32.TryParse("MyNumber", out myInteger)) {
ModelState.AddModelError("MyNumber", "That isn't a number!");
}
На самом деле существует множество решений, но я бы сказал, что пока выберите вариант 3.