2012-02-13 9 views
9

La mia domanda è, si spera, abbastanza semplice. Al momento dell'invio del mio modulo, desidero segnalare tutte le proprietà (campi) che hanno caratteri non validi (in particolare HTML) come errori del modello. Il problema che sto affrontando è che i calci di convalida della richiesta in prima modello vincolante/validazione e mi HTTP 500 ... ho visto un similar question che pubblicizza sia mediante l'attributo [AllowHtml] proprietà sulla vostra Modello/ViewModel o utilizzando <httpRuntime requestValidationMode="2.0" /> in web.config, ma quello che sto cercando è come "rileva globalmente le eccezioni di convalida della richiesta e le mostra come errori modello". Inoltre, non voglio "rimuovere" i tag HTML, voglio avvisare l'utente che il loro input non è valido.Come gestire le eccezioni di convalida di richieste ASP.NET MVC3 come errori di validazione del modello o della proprietà

Avevo pensato di usare convalida espressione regolare attributi per trovare cattivo di ingresso, ma come ho già detto, la richiesta di abilitazione su ASP.NET MVC3 si verifica prima modello vincolante/validazione, così che è un no-go ...

Davvero good overview of the Request Validation can be found here.

+0

Fammi capire il tuo problema. Vuoi contrassegnare le tue proprietà in code-behind e manipolarle in code-behind quando ci sono errori di validazione? –

risposta

10

Penso che la tua unica intenzione sia ottenere l'eccezione di convalida della richiesta durante l'associazione del modello e mostrare gli errori come errore di stato del modello. Ecco il campione,

using System.Web.Helpers; 
    public class MyModelBinder : DefaultModelBinder 
    { 
     public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
     { 
      try 
      { 
       return base.BindModel(controllerContext, bindingContext); 
      } 
      catch(HttpRequestValidationException ex) 
      { 
       var modelState = new ModelState(); 
       modelState.Errors.Add(ex.Message); 
       var key=bindingContext.ModelName; 
       var value = controllerContext.RequestContext.HttpContext.Request.Unvalidated().Form[key]; 
       modelState.Value = new ValueProviderResult(value, value,CultureInfo.InvariantCulture); 
       bindingContext.ModelState.Add(key, modelState); 
      } 
      return null; 
     } 
    } 

    protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 
     ModelBinders.Binders.DefaultBinder = new MyModelBinder(); 
    } 

Questo aggiungerà l'eccezione di solo convalida richiesta in stato di modello. Scusa, se non capisco la tua domanda chiaramente.

+0

Funziona, ma non mantiene il valore sui moduli come altre proprietà ... – zam6ak

+0

@ zam6ak, Aggiungi utilizzando System.Web.Helpers e vedere la mia risposta aggiornata. Nota, questa è solo una risposta rapida e non molto ottimizzata. Perdonami per quello. –

+0

Questo sembra funzionare bene - non sono sicuro perché stai dicendo che "non è molto ottimizzato" :) – zam6ak