当发生某种异常时,如何确保我的MVC应用程序重定向到错误页面?

时间:2011-08-17 16:04:05

标签: asp.net-mvc asp.net-mvc-3

我见过一个很好的例子,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 个答案:

答案 0 :(得分:2)

您可以在web.config中创建从HTTP结果代码到特定错误处理程序的映射:

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

答案 1 :(得分:0)

你必须以不同的方式处理ajax调用。我只是使用jquery $ .ajax的error()来处理那种ajax调用错误。

$.ajax({
    ...
    success: function(g) {
          //process normal
    },
    error: function(request, status, error) {
          //process exception here
    }
})