2009-03-23 6 views
1

L'un des filtres d'une application que je développe vérifie si un utilisateur possède l'élément qu'il essaie de modifier. L'action est décorée par l'attribut [RequiresOwnership], et à l'intérieur de la logique d'attribut, je vérifie pour voir si l'utilisateur possède l'élément, et si ce n'est pas le cas, je lance un UnauthorizedAccessException.Comment faire pour attraper une exception lancée par un filtre dans le MVC de .NET?

Ma question est la suivante: où puis-je attraper cette exception? Idéalement, j'aimerais rediriger l'utilisateur vers une page expliquant pourquoi ce qu'il a essayé de faire n'était pas autorisé, au lieu de simplement afficher une page d'exception. Je ne pense pas que j'attraperais l'exception dans l'action qui est décorée par l'attribut, donc y a-t-il une partie de base de l'application où je peux manipuler les exceptions levées plus haut, dans le modèle .NET MVC?

EDIT: Je me rends compte que je pourrais juste rediriger vers une page via le filtre lui-même, mais cela me semble un peu hacky. Ce serait bien de lancer des exceptions via des attributs, et d'avoir un endroit standard où ils peuvent être attrapés et traités.

Répondre

2

Je pense que ce que vous voulez est l'attribut [HandleError] sur votre contrôleur, qui prend un chemin facultatif à une vue de gestionnaire d'erreur. La valeur par défaut est ~/Views/Shared/Error.aspx; vous pourriez ajouter un support supplémentaire pour votre exception spécifique là-bas.

0

J'ai rencontré ce problème et la façon dont j'ai résolu le problème consistait à ajouter l'exception à la collection TempData de FilterContext au lieu de la lancer. Vous pouvez ensuite vérifier dans votre méthode d'action, re-lancer et traiter de manière appropriée:

Dans l'attribut:

if (/*some error condition*/) 
    filterContext.Controller.TempData["Err"] = new Exception("An error"); 

Et dans la méthode d'action:

var e = TempData["Err"] as Exception; 
if (e != null) 
    throw e; 

Il est une solution moins qu'idéale, mais comme vous l'avez mentionné, il n'y a pas d'endroit utile pour attraper les exceptions des attributs.

+0

* "il n'y a pas d'endroit utile pour attraper les exceptions des attributs." * Quel est le problème avec la réponse de @ GalacticCowboy? – seebiscuit

Questions connexes