5

Ho impostato un provider personalizzato per consentire l'impostazione di attributi di convalida da un archivio dati anziché in codice statico. Funziona alla perfezione con la validazione lato client nel mio progetto .NET MVC 4, ma non riesco a far funzionare la convalida lato server.Convalida lato server con Custom DataAnnotationsModelValidatorProvider

cs CustomModelValidatorProvider:

 

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

Nei miei Global.asax.cs ho:

 

    protected void Application_Start() 
    { 
     ModelValidatorProviders.Providers.Clear(); 
     ModelValidatorProviders.Providers.Add(new CustomModelValidatorProvider()); 
    } 

E in un metodo Web API che ho:

 

    var validationResultList = new List(); 
    bool valid = Validator.TryValidateObject(myModelObject, new ValidationContext(myModelObject, null, null), validationResultList, true); 

Qui, valido è sempre vero Anche quando la convalida del lato client Jquery mostra un errore. Sul lato server, il mio fornitore personalizzato non viene utilizzato per applicare le annotazioni dei dati. Quando imposto un breakpoint in GetValidators() viene chiamato quando viene creata la vista e vengono visualizzati correttamente i validatori lato client, ma non vengono richiamati quando il modello viene associato al controller.

Ho perso un passaggio? Qualsiasi aiuto è molto apprezzato!

UPDATE

Il validatore personalizzato funziona correttamente quando l'oggetto viene inviato a un controller, ma non viene licenziato una volta inviati a un ApiController.

+0

scusate ho postato un commento nell'altra domanda senza rendermi conto di questa era la tua domanda! Da quanto so, i controller API e i controller standard utilizzano legatori di modelli separati in modo che il problema potrebbe derivare dall'aggiunta non corretta del validatore al legatore modello corretto. Non al momento sul mio PC ma ne darò un'occhiata in seguito :) – Henry

+0

@HenryGarle Sì, ho appena provato questo e la convalida personalizzata funziona quando postata su un Controller, ma non su ApiController. Non sei sicuro di come registrarlo correttamente per ApiController. – Dave

+0

Ok questo è un buon inizio, l'ereditarietà di ModelValidatorProvider fa invece qualche differenza? – Henry

risposta

3

Finalmente ho capito, è una risposta piuttosto semplice. Gli ApiControllers rispondono solo ai provider nello spazio dei nomi System.Web.Http.Validation, non nello spazio dei nomi System.Web.Mvc utilizzato per i controller regolari e nella convalida lato client.

Ho implementato entrambi per ottenere sia la convalida lato client che la convalida del server in ApiControllers.