MVC: переопределить значение по умолчанию ValidationMessage - PullRequest
17 голосов
/ 27 ноября 2009

В мире MVC у меня такой вид модели ...

public class MyViewModel{

[Required]
public string FirstName{ get; set; }    }

... и такие вещи на мой взгляд ...

<%= Html.ValidationSummary("Please correct the errors and try again.") %>
<%= Html.TextBox("FirstName") %>
<%= Html.ValidationMessage("FirstName", "*") %>

Мой вопрос: если я отправлю эту форму без указания имени, я получу следующее сообщение «Поле FirstName обязательно для заполнения»

OK. Итак, я иду и меняю свою собственность на ...

[DisplayName("First Name")]
[Required]
public string FirstName{ get; set; }    

.. и теперь получите «Поле имени обязательно для заполнения»

Пока все хорошо.

Так что теперь я хочу, чтобы в сообщении об ошибке отображалось «Имя Бла Бла». Как я могу переопределить сообщение по умолчанию для отображения DisplayName + "Бла-бла", без аннотирования всех свойств чем-то вроде

[Required(ErrorMessage = "First Name Blah Blah")]

Приветствия

ETFairfax

Ответы [ 8 ]

16 голосов
/ 19 декабря 2009
public class GenericRequired: RequiredAttribute
{
    public GenericRequired()
    {
        this.ErrorMessage = "{0} Blah blah"; 
    }
}
13 голосов
/ 20 апреля 2014

Вот способ сделать это без подкласса RequiredAttribute. Просто сделайте несколько классов адаптеров атрибутов. Здесь я использую ErrorMessageResourceType / ErrorMessageResourceName (с ресурсом), но вы можете легко установить ErrorMessage или даже проверить наличие переопределений перед их установкой.

Global.asax.cs:

public class MvcApplication : HttpApplication {
    protected void Application_Start() {
        // other stuff here ...
        DataAnnotationsModelValidatorProvider.RegisterAdapter(
            typeof(RequiredAttribute), typeof(CustomRequiredAttributeAdapter));
        DataAnnotationsModelValidatorProvider.RegisterAdapter(
            typeof(StringLengthAttribute), typeof(CustomStringLengthAttributeAdapter));
    }
}

private class CustomRequiredAttributeAdapter : RequiredAttributeAdapter {
    public CustomRequiredAttributeAdapter(ModelMetadata metadata, ControllerContext context, RequiredAttribute attribute)
        : base(metadata, context, attribute)
    {
        attribute.ErrorMessageResourceType = typeof(Resources);
        attribute.ErrorMessageResourceName = "ValRequired";
    }
}

private class CustomStringLengthAttributeAdapter : StringLengthAttributeAdapter {
    public CustomStringLengthAttributeAdapter(ModelMetadata metadata, ControllerContext context, StringLengthAttribute attribute)
        : base(metadata, context, attribute)
    {
        attribute.ErrorMessageResourceType = typeof(Resources);
        attribute.ErrorMessageResourceName = "ValStringLength";
    }
}

В этом примере вы создадите файл ресурсов с именем Resources.resx с ValRequired в качестве нового требуемого сообщения по умолчанию и ValStringLength в качестве длины строки, превышающей сообщение по умолчанию. Обратите внимание, что для обоих, {0} получает имя поля, которое вы можете установить с помощью [Display(Name = "Field Name")].

12 голосов
/ 28 марта 2012

Кажется, что RequiredAttribute не реализует IClientValidatable, поэтому если вы переопределите RequiredAttribute, это нарушит проверку на стороне клиента.

Так вот что я сделал, и это работает. Надеюсь, это кому-нибудь поможет.

public class CustomRequiredAttribute : RequiredAttribute, IClientValidatable
{
    public CustomRequiredAttribute()
    {
        this.ErrorMessage = "whatever your error message is";
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        yield return new ModelClientValidationRule
        {
            ErrorMessage = this.ErrorMessage,
            ValidationType = "required"
        };
    }
}
2 голосов
/ 04 февраля 2012

Просто изменить

[Required] 

до

[Required(ErrorMessage = "Your Message, Bla bla bla aaa!")]
1 голос
/ 12 февраля 2014

Edit: я опубликовал это, потому что я искал это решение с атрибутом [Required] и не мог найти его. Создание нового Q / A выглядит не очень хорошо, так как этот вопрос уже существует.

Я пытался решить ту же самую проблему и нашел очень простое решение в MVC 4.

Во-первых, вам, вероятно, придется хранить сообщения об ошибках в каком-то месте. Я использовал пользовательские ресурсы, хорошо описанные в http://afana.me/post/aspnet-mvc-internationalization.aspx.

Важно то, что я могу получить любой ресурс (даже сообщение об ошибке), просто вызвав ResourcesProject.Resources.SomeCustomError или ResourcesProject.Resources.MainPageTitle и т. Д. Каждый раз, когда я пытаюсь получить доступ Класс ресурсов, он берет информацию о культуре из текущего потока и возвращает правильный язык.

У меня есть сообщение об ошибке для проверки поля в ResourcesProject.Resources.RequiredAttribute . Чтобы это сообщение отображалось в представлении, просто обновите атрибут [Обязательный] этими двумя параметрами.

ErrorMessageResourceType - Тип, который будет вызываться (в нашем примере ResourcesProject.Resources)

ErrorMessageResourceName - Свойство, которое будет вызываться для указанного выше типа (в нашем случае RequiredAttribute)

Вот очень упрощенная модель входа в систему, которая показывает только сообщение проверки имени пользователя. Когда поле пустое, оно возьмет строку из ResourcesProject.Resources.RequiredAttribute и отобразит ее как ошибку.

    public class LoginModel
    {        
        [Required(ErrorMessageResourceType = typeof(Resources.Resources), ErrorMessageResourceName="RequiredAttribute")]
        [Display(Name = "User name")]
        public string UserName { get; set; }
}
0 голосов
/ 07 мая 2016
using Resources;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Reflection;
using System.Resources;
using System.Web;
using System.Web.Mvc;

public class CustomRequiredAttribute : RequiredAttribute,  IClientValidatable
{
    public CustomRequiredAttribute()
    {
        ErrorMessageResourceType = typeof(ValidationResource);
        ErrorMessageResourceName = "RequiredErrorMessage";
    }


    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {


        yield return new ModelClientValidationRule
        {
            ErrorMessage = GetRequiredMessage(metadata.DisplayName),
            ValidationType = "required"
        };
    }


    private string GetRequiredMessage(string displayName) {

        return displayName + " " + Resources.ValidationResource.RequiredErrorMessageClient;        

    }


}

App_GlobalResources / ValidationResource.resx

enter image description here

Теперь используйте аннотацию данных

[CustomRequired]
0 голосов
/ 11 апреля 2012

Это сработало для меня. Внимательно читайте комментарии внутри кода. (На основании ответа Чада).

 // Keep the name the same as the original, it helps trigger the original javascript 
 // function for client side validation.

        public class RequiredAttribute : System.ComponentModel.DataAnnotations.RequiredAttribute, IClientValidatable
            {
                public RequiredAttribute()
                {
                    this.ErrorMessage = "Message" // doesnt get called again. only once.
                }

                public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
                {
                    yield return new ModelClientValidationRule
                    {
                        ErrorMessage = "Message", // this gets called on every request, so it's contents can be dynamic.
                        ValidationType = "required"
                    };
                }
            }
0 голосов
/ 27 ноября 2009

Вы можете написать свой собственный атрибут:

public class MyRequiredAttribute : ValidationAttribute
{
    MyRequiredAttribute() : base(() => "{0} blah blah blah blaaaaaah")
    {

    }

    public override bool IsValid(object value)
    {
        if (value == null)
        {
            return false;
        }
        string str = value as string;
        if (str != null)
        {
            return (str.Trim().Length != 0);
        }
        return true;
    }
}

Это копия RequiredAttribute из Reflector с измененным сообщением об ошибке.

...