2

J'ai une classe d'exception personnalisée:ASP.NET MVC 2 Modèle erreurs avec des exceptions personnalisées

public class MyException: Exception 
{ 
    public MyException(MyExceptionEnum myError) : base(myError.ToDescription()) { } 
    public MyException(MyExceptionEnum myError, Exception innerException) : base(myError.ToDescription(), innerException) { } 
} 

.ToDescription est une méthode d'extension sur MyExceptionEnum pour fournir des cartes ENUM à chaîne pour les détails de l'erreur d'exception.

Voilà comment je jette:

if (someCondition) 
    throw new MyException(MyExceptionEnum.SomeError); 

donc j'utiliser mon premier cteur, ce qui crée une nouvelle exception avec un message donné.

maintenant sur le contrôleur:

[HttpPost] 
public ActionResult UpdateFoo(Foo model) 
{ 
    try 
    { 
     _fooService.UpdateModel(model); 
     _unitOfWork.Commit(); 
    } 
    catch(MyException myException) 
    { 
     ViewData.ModelState.AddModelError("ModelErrors", myException); 
    } 

    return View("Index", model); 
} 

Et enfin un extrait de la vue:

ne fonctionne pas (exception est levée quand je débogage, erreur est ajouté pour modéliser l'état, mais rien n'est montré sur la page).

Mais si je change à la ligne suivante:

ViewData.ModelState.AddModelError("ModelErrors", myException.Message); 

Il fonctionne.

AddModelError a deux surcharges:

    chaîne
  1. , Exception (ne fonctionne pas pour moi)
  2. string
  3. , string (travaux)

Quelle est l'utilisation de la première surcharge alors ? Mon exception a un message d'exception interne, donc j'aurais pensé que l'extension HTML rendrait cela?

Comment gérer les exceptions personnalisées avec le ModelState alors? L'utilisation de la seconde surcharge est-elle correcte?

+1

+1 sur le q; J'ai remarqué que cela se produisait une fois avec une exception CLR; J'ai fini par le changer pour utiliser '.Message' et me suis dit que j'y réfléchirais plus tard. : P –

+1

:) Oui, je suis tenté de faire "oh, on dirait .Message fonctionne, c'est assez bon". Mais étant un bon petit développeur, je veux savoir pourquoi. – RPM1984

Répondre

5

Peu importe qu'il s'agisse d'une exception personnalisée ou prédéfinie. Ça ne marche tout simplement pas. Si vous avez une chance de regarder le code source MVC pour classe ModelError, vous pouvez voir qu'il a une propriété de chaîne publique ErrorMessage qui est utilisé pour afficher l'erreur lors de la validation se produit (dans ValidationExtensions classe).

Dans le constructeur de surcharge de ModelError (Exception d'exception), cependant, il définit simplement le ErrorMessage propriété sous forme de chaîne vide, plutôt que Exception.Message. C'est pourquoi tu ne vois rien.

+0

Alors, dites-vous que c'est un bug avec MVC? – RPM1984

+0

Je le crois :) – tshao

+1

+1 pour clarifier que cela ne semble pas important si c'est l'exception CLR/custom, et pour vérifier la source! –