2010-09-22 7 views
6

Gibt es eine Verwendung für die Überladung von AddModelError(), die eine Exception als Parameter verwendet?Zweck von ModelState.AddModelError mit Ausnahmeparameter

Wenn ich den folgenden Code in meinem Controller umfassen:

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

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

Und die folgende meiner Meinung nach:

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

Dann wird nur der Text "Etwas ist schief gelaufen ist" in dem Fehler angezeigt wird Zusammenfassung.

Antwort

3

Überprüfen der Quelle ModelError akzeptiert beide und die Verwendung ist für Modelltyp Konvertierung fehlgeschlagen.

In diesem speziellen Fall ist es notwendig, in den Ausnahmebaum zu gehen und innere Ausnahmen zu suchen, wenn nötig, um den eigentlichen Root-Fehler zu finden, und nicht eine generische Top-Level-Exception-Nachricht.

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

Wie Sie sehen können, durchläuft es die Exception im ModelError, um eine FormatException zu finden. Dies ist die einzige echte Referenz zu diesem ich in MVC 2 und MVC 3 finden kann.

Das heißt, es ist wahrscheinlich unnötig für den regelmäßigen Gebrauch.

+1

Ich bemerkte, MVC 3 scheint keine Ausnahmen in der ValidationSummary enthalten weiß nicht, ob es ein Fehler oder durch Design ist - aber sie sollten es deutlich in ihren Dokumenten angegeben haben. Ich habe versucht, neue FormatException ("etwas") zu übergeben - hat auch nicht funktioniert. –