6

[CustomExceptionFilter] 属性をクラスに追加することで呼び出すカスタム例外フィルターがあります。それは私が望むように機能しますが、アクションメソッドが(ajaxリクエストを介して)部分ビューを返す場合、例外(基本的には許可されていないページへのリダイレクト)は、その部分ビューをロードしていますページ。「親」URLを強制的にリロードする方法はありますか?

カスタム例外フィルターのコードは次のとおりです

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

例外をクライアントにバブルアップさせ、マクスウェルが提案したように処理することをお勧めします。

以前のプロジェクトでは、ajax エラーを処理するために特定の actionfilter を使用しました (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

これはあなたを助けます。

.IsAjaxRequest拡張メソッドを追加し、403ステータスコードをブラウザに返すだけで、jqueryajaxErrorがログインページへのリダイレクトを処理します

于 2011-09-16T12:51:25.660 に答える
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

リクエストが 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
}

ただし、マクスウェルが言ったように、それが ajax リクエストである場合は例外をバブルアップさせ、クライアントでエラーを処理できます。hereで説明されているように、ajaxリクエストで例外を処理する方法をグローバルに設定できます

于 2010-02-12T18:21:38.910 に答える
0

このリンクは 、jQueryを使用してAjax経由でコントローラーに投稿するときにASP.NET MVC例外を処理するのに役立ちました

最後に、javascript 関数をテストするときは、1 行目のアラートから始めます。関数に JavaScript エラーがあると、実行中に関数が停止する可能性があり、ブラウザーを介した JavaScript エラー フィードバックはありません (設定によって異なります)。

于 2011-07-05T00:48:40.443 に答える