DataAnnotations, динамически присоединяющие атрибуты

По-видимому, можно динамически присоединять атрибуты DataAnnotation к свойствам объекта во время выполнения и таким образом обеспечивать динамическую проверку.

Может ли кто-нибудь предоставить образец кода для этого?

31
задан Ronald Wildenberg 31 August 2010 в 08:24
поделиться

2 ответа

MVC имеет хук для предоставления вашего собственного ModelValidatorProvider. По умолчанию MVC 2 использует подкласс ModelValidatorProvider с именем DataAnnotationsModelValidatorProvider, который может использовать атрибуты System.DataAnnotations.ComponentModel.ValidationAttribute для проверки.

DataAnnotationsModelValidatorProvider использует отражение, чтобы найти все ValidationAttributes, и просто перебирает коллекцию для проверки ваших моделей. Все, что вам нужно сделать, это переопределить метод GetValidators и внедрить свои собственные атрибуты из любого источника, который вы выберете. Я использую этот метод для проверки соглашений, свойства с атрибутом DataType.Email всегда проходят через регулярное выражение, и использую этот метод для извлечения информации из базы данных, чтобы применить более ограничительные проверки для «неопытных» пользователей.

В следующем примере просто говорится: «Всегда делайте обязательными любые свойства FirstName»:

 public class CustomMetadataValidationProvider : DataAnnotationsModelValidatorProvider
 {
    protected override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context, IEnumerable<Attribute> attributes)
    {
        //go to db if you want
        //var repository = ((MyBaseController) context.Controller).RepositorySomething;

        //find user if you need it
        var user = context.HttpContext.User;

        if (!string.IsNullOrWhiteSpace(metadata.PropertyName) && metadata.PropertyName == "FirstName")
            attributes = new List<Attribute>() {new RequiredAttribute()};

        return base.GetValidators(metadata, context, attributes);
    }
}

Все, что вам нужно сделать, это зарегистрировать провайдера в вашем файле Global.asax.cs:

    protected void Application_Start()
    {
        ModelValidatorProviders.Providers.Add(new CustomMetadataValidationProvider());

        AreaRegistration.RegisterAllAreas();

        RegisterRoutes(RouteTable.Routes);
    }

Конечный результат:

end result

с этим модель:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime Birthday { get; set; }
}
42
ответ дан 27 November 2019 в 22:25
поделиться

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

Вам следует прочитать эту запись в блоге.

-1
ответ дан 27 November 2019 в 22:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: