Если ваш сценарий заключается в том, что вы пытаетесь прикрепить свой валидатор к свойству типа int, десятичное и т. Д., и , то значение, которое входит, не преобразуется в int, десятичное и т. Д. , то это намеренно.
Подумайте, что вы просите сделать MVC-фреймворк. Свойство имеет тип int, поэтому инфраструктура MVC работает со значениями типа int. (Технически, он работает с чем-то более похожим на Nullable .) Если входящее значение не может быть преобразовано в int, невозможно представить его в Nullable , отличном от null , так как Тип не может содержать произвольные строки. Вот почему ваш атрибут проверки в итоге получает null в качестве значения.
Изменить:
Если вы хотите управлять этим сообщением об ошибке, самый простой вариант - изменить свойство на строку, а затем попросить ваш пользовательский валидатор вызвать Int32.TryParse или выполнить все, что вам нужно, чтобы убедиться, что введенный пользователем текст числовой. Тогда у вас может быть отдельное свойство только для чтения, которое в основном представляет собой числовую форму значения этого свойства.
Более сложный, но более обобщенный, вы можете заменить встроенный DefaultModelBinder одним из ваших собственных созданий. В методе BindModel найдите исключения типа FormatException в ModelState, а затем замените их выбранным сообщением об ошибке. См. Конец метода DefaultModelBinder.BindProperty для примера того, как это делается.