2016-12-23 11 views
6

próbuję ot przesłonić RequiresAttribute w rdzeniu .net i nie wydają się działać na rdzeniu ASP.NET 1.1Zastąp istniejący adnotacji danych atrybutów w rdzeniu ASP.NET 1.1

Oto kod test

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); 
    } 

} 

gdy używany w moim modelu spodziewam normalny wynik jak „pole jest wymagane”, bo nie dostosował go jeszcze i po prostu wywołanie metody bazowych.

nie wydają się działać zgodnie z oczekiwaniami i po prostu omija wymagane po stronie klienta i serwera:

Ma to na celu dodanie komunikatu sprawdzania poprawności wyciągniętego z db do właściwości ErrorMessage.

Wszelkie sugestie będą mile widziane.

+0

Nie zastępujesz go, tworzysz klasę pochodną. Czy możesz pokazać, jak go używasz? – Klinger

+0

Pochodzę i jeśli to zadziała zastąpi niektóre metody, używam go jako standard w modelu tj. [CustomRequired] public string Name {get; set;} Miałem nadzieję, że w zamierzeniu wywoła on błąd, ale breakpoint nigdy nie trafi. – AliK

+1

Sprawdź, czy to SO pomaga: http://stackoverflow.com/questions/12573362/extending-the-mvc-requiredattribute – Klinger

Odpowiedz

2

Twój problem polega na tym, że ValidationAttributeAdapterProvider, która jest domyślną implementacją IValidationAttributeAdapterProvider, sprawdza tylko określone typy. W związku z tym użycie niestandardowych implementacji prowadzi do braku "dostawców adapterów", co prowadzi do braku atrybutów danych.

Rozwiązanie: dostarczyć własną implementację IValidationAttributeAdapterProvider, który może przekazać do wykonania domyślny dla non niestandardowych rzeczy ...

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); 
    } 
} 

... i zarejestrować go jako singleton.

services.AddSingleton<IValidationAttributeAdapterProvider, CustomValidationAttributeAdapterProvider>(); 
+0

Zmęczyłem się czymś podobnym i uważam, że jest to właściwy kierunek. – AliK

+0

@AliK To faktycznie działa. A może brakowało mi jakiegoś ważnego kroku? –

+0

Podążyłem podobnym schematem, ale tak też powinno działać. Problem jest w tym momencie, ponieważ wiesz, że framework ciągle się zmienia, więc na razie jego szczegóły pozwalają zobaczyć, co dzieje się z nowymi wersjami MS. – AliK

Powiązane problemy