6

我有一个自定义异常过滤器,我通过向我的类添加 [CustomExceptionFilter] 属性来调用它。它可以按我的意愿工作,但是如果操作方法返回部分视图(通过 ajax 请求),则异常(基本上是重定向到未授权页面)正在加载部分视图页。有没有办法强制它重新加载“父”网址?

这是自定义异常过滤器的代码

public class CustomExceptionFilter : FilterAttribute, IExceptionFilter
{
    public void OnException(ExceptionContext filterContext)
    {
        if (filterContext.Exception.GetType() == typeof(CustomSecurityException))
        {
            filterContext.ExceptionHandled = true;
            RequestContext rc = new RequestContext(filterContext.HttpContext, filterContext.RouteData);
            string url = RouteTable.Routes.GetVirtualPath(rc, new RouteValueDictionary(new { Controller = "NoAccess", action = "Index", message = filterContext.Exception.Message })).VirtualPath;
            filterContext.HttpContext.Response.Redirect(url, true);
        }
    }
}
4

8 回答 8

2

这是您需要在浏览器上处理的事情。例如,尝试处理jQuery.ajax() 调用上的 error()(显然不返回重定向..)。

于 2010-02-12T16:51:10.683 回答
1

我在表单标签中使用 OnFailure 处理程序。

<form id="AJAXForm" method="post" action=""
   onsubmit="Sys.Mvc.AsyncForm.handleSubmit(this, new Sys.UI.DomEvent(event),
   { insertionMode: Sys.Mvc.InsertionMode.replace, httpMethod: 'POST', 
   updateTargetId: 'myPartialPage', onSuccess: Function.createDelegate(this, ajaxFormSucced),
   onFailure: Function.createDelegate(this, ajaxFormFailure) });" >

... function ajaxFormSucced(){ // 成功代码 } function ajaxFormFailure(){ // 失败代码 }

于 2011-03-28T02:38:53.967 回答
1

我建议让异常冒泡给客户并像 Maxwell 建议的那样处理它。

在我们之前的项目中,我们使用了一个特定的 actionfilter 来处理 ajax 错误(从Suteki Shop借来的)。请注意,响应状态为 500(内部服务器错误)。为了在 JQuery.ajax() 调用中调用 de Error() 委托,响应需要一个错误状态。

 public class HandleErrorWithAjaxAttribute : HandleErrorAttribute
    {
        public HandleErrorWithAjaxAttribute()
        {
            ShowStackTraceIfNotDebug = true;
        }

        public bool ShowStackTraceIfNotDebug { get; set; }

        public override void OnException(ExceptionContext filterContext)
        {
            if (filterContext.HttpContext.Request.IsAjaxRequest())
            {
                string content = ShowStackTraceIfNotDebug ||
                                 filterContext.HttpContext.IsDebuggingEnabled
                                     ?
                                         filterContext.Exception.StackTrace
                                     :
                                         string.Empty;
                filterContext.Result = new ContentResult
                                           {
                                               ContentType = MediaTypeNames.Text.Plain,
                                               Content = content
                                           };
                filterContext.HttpContext.Response.Status =
                    "500 " + filterContext.Exception.Message
                                 .Replace("\r", " ")
                                 .Replace("\n", " ");
                filterContext.ExceptionHandled = true;
                filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
            }
            else
            {
                base.OnException(filterContext);
            }
        }
    }
于 2010-02-19T12:00:43.603 回答
0

您是否尝试清除响应?控制器可能仍在设置响应内容。

filterContext.HttpContext.Response.Clear()
filterContext.Result = new JsonResult { Data = new { Message = message } };
filterContext.HttpContext.Response.StatusCode = 500;
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
于 2010-08-31T18:58:51.307 回答
0

此链接帮助我 在使用 jQuery 通过 Ajax 发布到控制器时处理 ASP.NET MVC 异常

最后,在测试 javascript 函数时,从第一行的 alert 开始。函数中的任何 javascript 错误都可能会在没有通过浏览器的 javascript 错误反馈的情况下在执行过程中停止函数(取决于您的设置)。

于 2011-07-05T00:48:40.443 回答
0

您可以验证请求是否是 ajax 请求。例如,您可以执行以下操作...

if (!filterContext.HttpContext.Request.IsAjaxRequest()){
    //Return a ViewResult
    //filterContext.ExceptionHandled = true;
    //filterContext.Result = new ViewResult { ViewName = "Error" ... };
}
else{
    //An ajax request. 
    //return a partial view
}

但是,正如 Maxwell 所说,如果它是一个 ajax 请求,您可以让异常冒泡并处理客户端上的错误。您可以全局设置一种在 ajax 请求中处理异常的方法,就像这里描述的那样

于 2010-02-12T18:21:38.910 回答
0

将对您有所帮助。

只需添加 .IsAjaxRequest 扩展方法并向浏览器返回 403 状态码,jquery ajaxError 将处理它重定向到登录页面

于 2011-09-16T12:51:25.660 回答
0

正如麦克斯韦所说,处理客户端,使用类似这样的东西

function handleError(ajaxContext) {
    // Load parent
}

@using (Ajax.BeginForm("Index", "Home", new AjaxOptions
{         
    UpdateTargetId = "MyDiv",
    OnFailure = "handleError"
}))

您必须做的是确保 NoAccess 的控制器 ActionResult 代码包含以下代码,以便触发您的 ajax 错误。

HttpContext.Response.StatusCode = 401;
于 2013-11-24T23:59:26.323 回答