Как заменить стандартные сообщения об ошибках DataAnnotations - PullRequest
7 голосов
/ 01 февраля 2010

Я использую System.ComponontModel.DataAnnotations для проверки объектов моей модели. Как я могу заменить стандартные атрибуты сообщений (Required и StringLength) без предоставления атрибута ErrorMessage каждому из них или подклассификации?

Ответы [ 2 ]

8 голосов
/ 09 февраля 2010

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

Посмотрите на ValidationAttribute - базовый класс атрибутов проверки.

Если произошла ошибка проверки, сообщение об ошибке будет создано методом:

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

Следующий взгляд на ErrorMessageString свойство:

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

Свойство ResourceAccessor можно установить с:

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

Первый из них в точности используется классами dervided для форматирования сообщений, второй - случай, когда мы устанавливаем свойство сообщения через ErrorMessage , и третий - когда используются строки ресурсов. В зависимости от вашей ситуации вы можете использовать ErrorMessageResourceName .

В другом месте давайте посмотрим на производные конструкторы, для нашего примера, Range Attribute:

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

Здесь RangeAttribute_ValidationError загружается из ресурса:

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

Таким образом, вы можете создать файл ресурсов для различной культуры загара и переписать туда сообщения, например:

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

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

6 голосов
/ 01 февраля 2010

Можно использовать ErrorMessage свойство базового класса ValidationAttribute для всех валидаторов DataAnnotations.

Например:

[Range(0, 100, ErrorMessage = "Value for {0} must be between {1} and {2}")]
public int id;

Может быть, это поможет.

...