Как отловить исключение, выброшенное фильтром в MVC .NET? - PullRequest
2 голосов
/ 23 марта 2009

Один из фильтров в приложении, которое я разрабатываю, проверяет, есть ли у пользователя элемент, который он пытается изменить. Действие оформлено атрибутом [RequiresOwnership], и внутри логики атрибута я проверяю, есть ли у пользователя элемент, а если нет, я выбрасываю UnauthorizedAccessException.

У меня такой вопрос: где я могу поймать это исключение? В идеале я хотел бы перенаправить пользователя на страницу, объясняющую, почему то, что он пытался сделать, не позволили, вместо того, чтобы просто показать страницу исключения. Я не думаю, что поймал бы исключение внутри действия, которое оформлено атрибутом, так есть ли какая-то базовая часть приложения, где я могу обрабатывать исключения, выдвинутые выше, в модели .NET MVC?

РЕДАКТИРОВАТЬ: я понимаю, что я мог бы просто перенаправить на страницу через сам фильтр, но это кажется мне немного хакерским. Было бы неплохо бросать исключения через атрибуты и иметь одно стандартное место, где их можно ловить и обрабатывать.

Ответы [ 2 ]

2 голосов
/ 23 марта 2009

Я думаю, что вам нужен атрибут [HandleError] вашего контроллера, который принимает необязательный путь к представлению обработчика ошибок. По умолчанию используется ~ / Views / Shared / Error.aspx; Вы можете добавить дополнительную поддержку для вашего конкретного исключения.

0 голосов
/ 20 ноября 2009

У меня была эта проблема, и я решил, что нужно добавить исключение в коллекцию TempData FilterContext, а не бросать ее. Затем вы можете проверить это в вашем методе действия, перебросить его и обработать соответствующим образом:

В атрибуте:

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

А в методе действия:

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

Это далеко не идеальное решение, но, как вы упомянули, полезного места для отлова исключений из атрибутов нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...