Skonfigurowałem niestandardowego dostawcę, aby zezwolić na ustawianie atrybutów sprawdzania poprawności ze składnicy danych zamiast w kodzie statycznym. Działa wspaniale z walidacją po stronie klienta w moim projekcie .NET MVC 4, ale nie mogę uzyskać poprawności działania po stronie serwera.Sprawdzanie poprawności po stronie serwera przy użyciu niestandardowego obiektu DataAnnotationsModelValidatorProvider
CustomModelValidatorProvider .cs:
public class CustomModelValidatorProvider : DataAnnotationsModelValidatorProvider { protected override IEnumerable GetValidators(ModelMetadata metadata, ControllerContext context, IEnumerable attributes) { // set attributes from datastore here return base.GetValidators(metadata, context, attributes); } }
W moich Global.asax.cs mam:
protected void Application_Start() { ModelValidatorProviders.Providers.Clear(); ModelValidatorProviders.Providers.Add(new CustomModelValidatorProvider()); }
A w metodzie Web API mam:
var validationResultList = new List(); bool valid = Validator.TryValidateObject(myModelObject, new ValidationContext(myModelObject, null, null), validationResultList, true);
Tutaj valid jest zawsze prawdziwe. Nawet gdy sprawdzanie poprawności strony klienta Jquery wyświetla błąd. Po stronie serwera mój niestandardowy dostawca nie jest używany do stosowania adnotacji danych. Kiedy ustawiam punkt przerwania w GetValidators(), jest wywoływany, gdy tworzony jest widok i poprawnie wyświetla walidatory po stronie klienta, ale nie jest wywoływany ponownie, gdy model jest powiązany z kontrolerem.
Czy spudłowałem o krok? Każda pomoc jest bardzo cenna!
UPDATE
Zwyczaj walidator działa poprawnie, gdy obiekt zostanie wysłana do kontrolera, ale nie zostanie zwolniony, gdy pisał do ApiController.
Przepraszam, wysłałem komentarz w drugim pytaniu, nie zdając sobie sprawy, że to było twoje pytanie! Z tego co wiem, kontrolery API i standardowe kontrolery używają oddzielnych segregatorów modeli, więc problem może wynikać z nieprawidłowego dodania walidatora do poprawnego modułu wiążącego model. Obecnie nie na moim komputerze, ale zajrzę do niego później :) – Henry
@HenryGarle Tak, właśnie to przetestowałem i niestandardowe sprawdzanie poprawności działa po wysłaniu do kontrolera, ale nie do ApiController. Nie wiem, jak zarejestrować go poprawnie dla ApiController. – Dave
Ok to dobry początek, czy dziedziczenie z ModelValidatorProvider zamiast zrobić jakąkolwiek różnicę? – Henry