How to replace standard DataAnnotations error messages

后端 未结 3 1794
小蘑菇
小蘑菇 2021-01-18 03:56

I\'m using System.ComponontModel.DataAnnotations to validate my model objects. How could I replace messages standard attributes (Required and StringLength) produce without p

3条回答
  •  悲哀的现实
    2021-01-18 04:48

    Writing new post because I need more formatting than comments provide.

    Look at ValidationAttribute - base class of validation attributes.

    If validation error occured, error message will be created by method:

    public virtual string FormatErrorMessage(string name)
    {
        return string.Format(CultureInfo.CurrentCulture, this.ErrorMessageString, new object[] { name });
    }
    

    Next look at ErrorMessageString property:

    protected string ErrorMessageString
    {
        get
        {
            if (this._resourceModeAccessorIncomplete)
            {
                throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, DataAnnotationsResources.ValidationAttribute_NeedBothResourceTypeAndResourceName, new object[0]));
            }
            return this.ResourceAccessor();
        }
    }
    

    Property ResourceAccessor can be setted from:

    ValidationAttribute..ctor(Func)
    ValidationAttribute.set_ErrorMessage(String) : Void
    ValidationAttribute.SetResourceAccessorByPropertyLookup() : Void
    

    First of it is exactly used by dervided classes to format messages, second - the case when we set error message trough ErrorMessage property, and third - when resource strings used. Depending on your situation, you may use ErrorMessageResourceName.

    Elsewhere let's look at derived constructors, for our example, Range Attribute:

    private RangeAttribute()
        : base((Func) (() => DataAnnotationsResources.RangeAttribute_ValidationError))
    {
    }
    

    Here RangeAttribute_ValidationError is loaded from resource:

    internal static string RangeAttribute_ValidationError
    {
        get
        {
            return ResourceManager.GetString("RangeAttribute_ValidationError", resourceCulture);
        }
    }
    

    So you can create resource file for different tan default culture and overwrite messages there, like this:

    http://www.codeproject.com/KB/aspnet/SatelliteAssemblies.aspx

    http://msdn.microsoft.com/en-us/library/aa645513(VS.71).aspx

提交回复
热议问题