2010-09-22 5 views
6

Existe-t-il une utilisation pour la surcharge de AddModelError() qui prend une exception en tant que paramètre?But de ModelState.AddModelError avec le paramètre d'exception

Si j'inclure le code suivant dans mon contrôleur:

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

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

Et ce qui suit à mon avis:

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

seul le texte « Quelque chose a qui a mal tourné » est affiché dans l'erreur résumé.

Répondre

3

Vérification de la source ModelError accepte les deux et l'utilisation est pour les échecs de conversion de type de modèle.

Dans ce cas particulier, il s'agit de descendre dans l'arborescence des exceptions et de saisir des exceptions internes si nécessaire pour trouver l'erreur racine réelle plutôt qu'un message générique d'exception de niveau supérieur.

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

Comme vous pouvez le voir tourne en boucle à travers l'exception dans le ModelError trouver un FormatException. C'est la seule référence réelle à ce que je peux trouver à la fois dans MVC 2 et MVC 3.

Cela dit, il est probablement inutile pour une utilisation régulière.

+1

J'ai remarqué que MVC 3 ne semble pas inclure d'exceptions dans le ValidationSummary, mais il ne devrait pas savoir si c'est un bug ou un design - mais il aurait dû l'indiquer clairement dans ses documents. J'ai essayé de passer une nouvelle FormatException ("quelque chose") - ne fonctionnait pas non plus. –