Как создать пользовательский атрибут в аннотации данных - PullRequest
0 голосов
/ 23 октября 2011

Как я могу создать пользовательский атрибут в аннотации данных? Я хочу установить имя элемента управления, связанное с объявлением свойства. Я не нашел подходящего атрибута.

Как я могу это сделать?

спасибо

1 Ответ

1 голос
/ 23 октября 2011

Вы должны расширить System.ComponentModel.DataAnnotations.ValidationAttribute

K. Скотт Аллен (из OdeToCode ) имеет отличный пример, где он создает собственный атрибут "GreaterThan".

http://odetocode.com/blogs/scott/archive/2011/02/21/custom-data-annotation-validator-part-i-server-code.aspx

Ниже приведен фрагмент кода:

public class GreaterThanAttribute : ValidationAttribute
{
    public GreaterThanAttribute(string otherProperty)
        :base("{0} must be greater than {1}")
    {
        OtherProperty = otherProperty;
    }

    public string OtherProperty { get; set; }

    public override string FormatErrorMessage(string name)
    {            
        return string.Format(ErrorMessageString, name, OtherProperty);
    }

    protected override ValidationResult 
        IsValid(object firstValue, ValidationContext validationContext)
    {
        var firstComparable = firstValue as IComparable;
        var secondComparable = GetSecondComparable(validationContext);

        if (firstComparable != null && secondComparable != null)
        {
            if (firstComparable.CompareTo(secondComparable) < 1)
            {
                return new ValidationResult(
                    FormatErrorMessage(validationContext.DisplayName));
            }
        }               

        return ValidationResult.Success;
    }        

    protected IComparable GetSecondComparable(
        ValidationContext validationContext)
    {
        var propertyInfo = validationContext
                              .ObjectType
                              .GetProperty(OtherProperty);
        if (propertyInfo != null)
        {
            var secondValue = propertyInfo.GetValue(
                validationContext.ObjectInstance, null);
            return secondValue as IComparable;
        }
        return null;
    }
}
...