asp.net исключение привязки свойства mvc int - PullRequest
2 голосов
/ 10 августа 2010

В моем классе есть свойство int, и я хочу проверить, ввел ли пользователь строку. Как я могу сделать это, используя аннотации данных? Когда я передаю нецелое значение, я получаю следующее выражение:

The value 'asdasd' is not valid for property.

Например, используя этот атрибут проверки:

[Range(0, Int32.MaxValue, ErrorMessage="Invalid Number")]
public int? Number { get; set; }

и введя 'aaa' в поле, которое использует модель, я получил исключение с этим сообщением:

The value 'aaa' is not valid for Number.

Вместо сообщения «Неверный номер».

Есть идеи?


Я положил

[Range(0, Int32.MaxValue, ErrorMessage="Invalid Number")]
public int? Number { get; set; }

но я получил это сообщение от исключения

The value 'aaa' is not valid for Number.

Ответы [ 2 ]

6 голосов
/ 14 августа 2010

Здесь есть два этапа проверки.

Перед вызовом проверки, установленной в ваших атрибутах, платформа сначала пытается проанализировать информацию.

Итак, вот несколько примеров, основанных на этом коде:

[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.

0 голосов
/ 11 августа 2010

Вы можете поместить атрибут Range в поле модели следующим образом:

[Range(0, 9999)]
public int Something {get; set;}

Теперь, когда пользователь вводит строку, она не будет проверяться, и значение int должно быть в диапазоне 0-9999

это также должно работать с

[Range(0, 9999)]
public string Something {get; set;}

и

[Range(0, 9999)]
public object Something {get; set;}
...