2010-09-22 9 views
6

Esiste un utilizzo per il sovraccarico di AddModelError() che accetta un'eccezione come parametro?Scopo di ModelState.AddModelError con parametro di eccezione

Se includo il seguente codice nel mio controller:

ModelState.AddModelError("", new Exception("blah blah blah")); 
ModelState.AddModelError("", "Something has went wrong"); 

if (!ModelState.IsValid) 
    return View(model); 

e di seguito nel mio punto di vista:

<%= Html.ValidationSummary("Please correct the errors and try again.") %> 

Poi solo il testo "Qualcosa è andato storto" viene visualizzato l'errore sommario.

risposta

3

Controllo della fonte ModelError accetta entrambi e l'utilizzo è per errori di conversione del tipo di modello.

In questo caso particolare è necessario scendere lungo l'albero delle eccezioni ed eseguire le eccezioni interne quando necessario per trovare l'errore di root effettivo anziché un messaggio di eccezione di livello superiore generico.

foreach (ModelError error in modelState.Errors.Where(err => String.IsNullOrEmpty(err.ErrorMessage) && err.Exception != null).ToList()) { 
    for (Exception exception = error.Exception; exception != null; exception = exception.InnerException) { 
     if (exception is FormatException) { 
      string displayName = propertyMetadata.GetDisplayName(); 
      string errorMessageTemplate = GetValueInvalidResource(controllerContext); 
      string errorMessage = String.Format(CultureInfo.CurrentCulture, errorMessageTemplate, modelState.Value.AttemptedValue, displayName); 
      modelState.Errors.Remove(error); 
      modelState.Errors.Add(errorMessage); 
      break; 
     } 
    } 
} 

Come si può vedere è scorrendo l'eccezione nel ModelError per trovare un FormatException. Questo è l'unico vero riferimento a questo che posso trovare in MVC 2 e MVC 3.

Detto questo, probabilmente non è necessario per l'uso regolare.

+1

Ho notato che MVC 3 non sembra includere eccezioni nel ValidationSummary, non so se si tratta di un bug o di un design, ma dovrebbero averlo dichiarato chiaramente nei loro documenti. Ho provato a passare il nuovo FormatException ("qualcosa") - non ha funzionato neanche. –

Problemi correlati