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

Asp.net mvc 当某个异常发生时,如何确保我的MVC应用程序重定向到错误页面?,asp.net-mvc,asp.net-mvc-3,Asp.net Mvc,Asp.net Mvc 3,我看到了一个很好的例子,其中MVC控制器类继承自另一个控制器类,该控制器类处理异常并返回一个包含错误的视图,如下所示: public class ApplicationController : Controller { public ActionResult NotFound() { return View("NotFound"); } public ActionResult InsufficientPriveleges() {

我看到了一个很好的例子,其中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);
    }
}
但是,我注意到,例如,我的控制器正在部分视图中加载用户不应该访问的内容,错误将显示在页面的部分视图中


我希望整个页面显示错误,实际上异常应该重定向到一个全新的页面。如何使用上面显示的当前类实现这一点?

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

<customErrors mode="On" defaultRedirect="~/Error">
  <error statusCode="401" redirect="~/Error/Unauthorized" />
  <error statusCode="404" redirect="~/Error/NotFound" />
</customErrors>
然后从控制器中抛出HttpException

public ActionResult Test ()
{
    throw new HttpException ((int)HttpStatusCode.Unauthorized, "Unauthorized");
}
另一种选择是使用自定义检查引发HttpException的权限

[Authorize (Roles = SiteRoles.Admin)]
public ActionResult Test ()
{
  return View ();
}

您必须以不同的方式处理ajax调用。我只需要使用jquery$.ajax的error()来处理这种ajax调用错误

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

我想这将回答你的问题:我似乎不能在儿童行为中抛出异常。我认为我需要能够在服务层的任何位置抛出异常,而不管我在渲染管道中的什么位置,并让重新定向发生。有什么想法吗?你介意展示有问题的局部视图和相关操作吗?可能在局部视图的情况下处理得很好……是的,在Razor视图中,我使用Html.RenderAction()。这将调用控制器上的子操作以渲染局部视图。在呈现视图时,调用服务以获取一些数据。此时,如果不允许用户查看数据,服务可能会引发异常。我认为MVC不喜欢在渲染管线内抛出异常。不确定如何绕过此问题…请参阅我在上面关于在子操作中引发异常的评论。更新:上述方法可行,但我可能会补充一点,如果要有效地呈现新的错误页面,尝试在控制器的子操作中引发异常会导致问题。相反,我从控制器上的主操作而不是任何子操作检查并引发异常。
$.ajax({
    ...
    success: function(g) {
          //process normal
    },
    error: function(request, status, error) {
          //process exception here
    }
})