Проверка asp.net mvc должна быть номером пользовательской ошибки
Я новичок в asp.net, и у меня есть проблема. Когда пользователи вставляют в редактор для десятичного поля нечто иное, чем числа, они получают ошибку "Имя поля" не является числом. Но я не хочу, чтобы они получили это сообщение, я хочу, чтобы они получили другое сообщение. У меня нет проблем с этим с помощью необходимых и валидаторов диапазона.
Есть ли способ сделать это?
Я не говорю о необходимости изменения культуры, просто отображающей другое сообщение.
Спасибо.
Ответы
Ответ 1
Это фактический ответ:
Создайте класс CustomClientDataTypeModelValidatorProvider
. Скопируйте код из источников MVC. Измените метод MakeErrorString
, чтобы вывести соответствующее сообщение следующим образом:
private static string MakeErrorString(string displayName)
{
return string.Format(
CultureInfo.CurrentCulture,
Core.Resources.Errors.EroareNuENr,
displayName);
}
Я не мог найти способ не копировать код, просто расширяя его, поскольку он использует этот статический метод.
Если кто-нибудь это знает, скажите мне.
Затем в global.asax я написал следующее:
var cdProvider = ModelValidatorProviders.Providers.SingleOrDefault(p => p.GetType().Equals(typeof(ClientDataTypeModelValidatorProvider)));
if(cdProvider != null)
{
ModelValidatorProviders.Providers.Remove(cdProvider);
ModelValidatorProviders.Providers.Add(
new CustomClientDataTypeModelValidatorProvider());
}
так что поток действительно будет перенаправлен на мой класс, а не на класс в dll asp.net MVC
У меня появилась идея здесь:
Ответ 2
Надеюсь, я понимаю ваш, чтобы изменить RangeValidator
ErrorMessage
только инициализировать параметр ErrorMessage
:
[Range(0, 100, ErrorMessage = "Some another error message insert here!")]
[RegularExpression("\d", ErrorMessage = "!!!")]
public decimal DecimalField { get; set; }
Ответ 3
К сожалению, это не тривиальная задача. Однако вы можете попробовать следующий взлом...
Лучше сделать это только на важных полях, так как это больше кода для поддержки.
В методе действий контроллера
if(ModelState.IsValid)
{
// code
}
else
{
if (ModelState["YourField"].Errors.Count > 0)
{
ModelState["YourField"].Errors.Clear();
ModelState.AddModelError("YourField", "Your custom message here");
}
// code
}
Ответ 4
Вы можете установить ResourceClassKey
класса ClientDataTypeModelValidatorProvider на имя глобального ресурса, содержащего ключ FieldMustBeNumeric
, чтобы заменить сообщение об ошибке проверки mvc номера вашим пользовательским сообщением. Также ключ сообщения об ошибке валидации даты FieldMustBeDate
.
ClientDataTypeModelValidatorProvider.ResourceClassKey="MyResources"; // MyResource is my global resource
Подробнее о том, как добавить файл MyResources.resx
в проект, см. здесь:
Поле должно быть числом. Как изменить это сообщение на другой язык?
Ответ 5
Чтобы изменить сообщение об ошибке, которое вы получите после проверки на стороне сервера, вам нужно изменить ключ "PropertyValueInvalid" в файле ресурсов и назначить имя файла ресурса DefaultModelBinder.ResourceClassKey
. См. Этот вопрос для деталей: локализовать проверку модели по умолчанию в mvc 2
Ответ 6
Ищите решение в конце этой страницы:
http://jwwishart.wordpress.com/2010/03/22/custom-server-and-client-side-required-validator-in-mvc-2-using-jquery-validate/
Я проверил это в своем проекте RTM MVC 3, и он работает хорошо.
Ответ 7
... или использовать jQuery для изменения сообщения на клиенте.
Ответ 8
Вы можете реализовать свой собственный атрибут проверки: http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx
Ответ 9
Похоже, что поскольку ответ Para MVC развился, и теперь ClientDataTypeModelValidatorProvider принимает свойство ResourceClassKey. Он использует сообщения FieldMustBeNumeric и FieldMustBeNumeric, указанные в вашем классе ресурсов.