Как я могу убедиться, что мое приложение MVC перенаправляет на страницу с ошибкой при возникновении определенного исключения? - PullRequest
2 голосов
/ 17 августа 2011

Я видел хороший пример, в котором класс контроллера MVC наследуется от другого класса контроллера, который обрабатывает исключение и возвращает представление с ошибкой внутри, например:

public class ApplicationController : Controller
{
    public ActionResult NotFound()
    {
        return View("NotFound");
    }

    public ActionResult InsufficientPriveleges()
    {
        return View("InsufficientPriveleges");
    }

    protected override void OnException(ExceptionContext filterContext)
    {
        if (filterContext.Exception is NotFoundException)
        {
            filterContext.Result = NotFound();
            filterContext.ExceptionHandled = true;
            return;
        }
        if (filterContext.Exception is InsufficientPrivelegesException)
        {
            filterContext.Result = InsufficientPriveleges();
            filterContext.ExceptionHandled = true;
            return;
        }

        base.OnException(filterContext);
    }
}

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

Я бы хотел, чтобы на всей странице отображалась ошибка, в действительности исключение должно перенаправить на совершенно новую страницу. Как я могу добиться этого, используя текущий класс, показанный выше?

Ответы [ 2 ]

2 голосов
/ 17 августа 2011

Вы можете создать отображение из кодов результатов HTTP в определенные обработчики ошибок в вашем файле web.config:

<customErrors mode="On" defaultRedirect="~/Error">
  <error statusCode="401" redirect="~/Error/Unauthorized" />
  <error statusCode="404" redirect="~/Error/NotFound" />
</customErrors>

и затем создайте пользовательский контроллер ошибок

public class ErrorController
{ 
        public ActionResult Index ()
        {
            return View ("Error");
        }

        public ActionResult Unauthorized ()
        {
            return View ("Error401");
        }

        public ActionResult NotFound ()
        {
            return View ("Error404");
    }
    }

и затем выбросить HttpException с ваших контроллеров

public ActionResult Test ()
{
    throw new HttpException ((int)HttpStatusCode.Unauthorized, "Unauthorized");
}

другой альтернативой является использование пользовательского FilterAttribute для проверки разрешений, которые выдают HttpException

[Authorize (Roles = SiteRoles.Admin)]
public ActionResult Test ()
{
  return View ();
}
0 голосов
/ 18 августа 2011

Вы должны обрабатывать вызов ajax по-другому. Я бы просто использовал error () jquery $ .ajax для обработки такого рода ошибки вызова ajax.

$.ajax({
    ...
    success: function(g) {
          //process normal
    },
    error: function(request, status, error) {
          //process exception here
    }
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...