Проверка 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

Ответ 9

Похоже, что поскольку ответ Para MVC развился, и теперь ClientDataTypeModelValidatorProvider принимает свойство ResourceClassKey. Он использует сообщения FieldMustBeNumeric и FieldMustBeNumeric, указанные в вашем классе ресурсов.