Переопределить существующий атрибут аннотации данных в asp.net core 1.1

Я пытаюсь переопределить RequiredAttribute в ядре .net и, похоже, не работает на ядре asp.net 1.1

Вот тестовый код

public class CustomRequiredAttribute : RequiredAttribute
{
    public CustomRequiredAttribute():base()
    {

    }

    public override string FormatErrorMessage(string name)
    {
        return base.FormatErrorMessage(name);
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        return base.IsValid(value, validationContext);
    }

}

После использования на моей модели я ожидаю нормального результата, такого как field is required, поскольку я еще не настраивал его и просто вызываю базовые методы.

Кажется, что это не работает должным образом и просто обходит требования как на стороне клиента, так и на стороне сервера.

Цель этого - добавить сообщение проверки, полученное из базы данных, в свойство ErrorMessage.


person AliK    schedule 23.12.2016    source источник
comment
Вы не переопределяете его, вы создаете производный класс. Можете показать, как вы его используете?   -  person Klinger    schedule 28.12.2016
comment
Я получаю, и как только он сработает, он переопределит определенные методы, я использую его в качестве стандарта в модели, то есть [CustomRequired] public string Name {get; set;} Я надеялся, что, как и предполагалось, он вызовет isvalid, но точка останова никогда не сработает.   -  person AliK    schedule 28.12.2016
comment
Посмотрите, помогает ли этот SO: stackoverflow.com/questions/12573362/   -  person Klinger    schedule 28.12.2016
comment
Не совсем так, поскольку я использую ядро ​​.net, и кажется, что DataAnnotationsModelValidatorProvider не существует ни в одной из библиотек.   -  person AliK    schedule 28.12.2016
comment
Когда вы смотрите на свой html, видите ли вы атрибут data-val-required?   -  person Klinger    schedule 28.12.2016
comment
@klinger нет, это не так, и это именно то, что я пытаюсь увидеть, а затем переопределить, когда он существует, но кажется, что атрибуты не записываются в html, и все же, если я использую стандартный атрибут из пространства имен, например [Обязательно (ErrorMessage = test)], который работает нормально, проблема возникает только тогда, когда я пытаюсь использовать свой собственный.   -  person AliK    schedule 28.12.2016
comment
@Bagus Я знаю, что он есть, но, похоже, я не могу его использовать, поскольку у него нет метода регистрации, как описано в этом сообщении, я бы предположил, что это статический метод для этого класса.   -  person AliK    schedule 28.12.2016


Ответы (1)


Ваша проблема в том, что ValidationAttributeAdapterProvider, который является реализацией IValidationAttributeAdapterProvider по умолчанию, проверяет только определенные типы. Таким образом, использование пользовательских реализаций приводит к отсутствию «поставщиков адаптеров», что приводит к отсутствию атрибутов данных.

Решение: предоставьте свою собственную реализацию IValidationAttributeAdapterProvider, которая может перенаправить на реализацию по умолчанию для нестандартных вещей ...

public class CustomValidationAttributeAdapterProvider : IValidationAttributeAdapterProvider
{
    private IValidationAttributeAdapterProvider innerProvider = new ValidationAttributeAdapterProvider();

    public IAttributeAdapter GetAttributeAdapter(ValidationAttribute attribute, IStringLocalizer stringLocalizer)
    {
        if (attribute == null)
            throw new ArgumentNullException(nameof(attribute));

        var type = attribute.GetType();

        if (type == typeof(CustomRequiredAttribute))
            return new RequiredAttributeAdapter((RequiredAttribute)attribute, stringLocalizer);

        return innerProvider.GetAttributeAdapter(attribute, stringLocalizer);
    }
}

... и зарегистрируйте его как синглтон.

services.AddSingleton<IValidationAttributeAdapterProvider, CustomValidationAttributeAdapterProvider>();
person Axel Heer    schedule 29.12.2016
comment
Я устал от чего-то подобного и считаю, что это правильный путь. - person AliK; 30.12.2016
comment
@AliK Это действительно работает. Или я пропустил какой-то важный шаг? - person Axel Heer; 31.12.2016
comment
Я последовал аналогичному шаблону, но да, это тоже должно сработать. Проблема в том, что на данный момент, поскольку вы знаете, что фреймворк постоянно меняется, поэтому пока все в порядке, позволяет посмотреть, что происходит с новыми выпусками от MS. - person AliK; 03.01.2017