0

MVC4 モバイル アプリケーションから表示するカスタム エラー ページを取得しようとしていますが、カスタム ページの代わりに「ページの読み込みエラー」という黄色のメッセージが表示され続けます。

アクションとコントローラーで以下のようにHandleErrorAttributeを使用しようとしましたが、成功しませんでした

[HandleError(ExceptionType = typeof(SqlException), View = "DatabaseError")]

ベースコントローラーの OnException メソッドをオーバーライドしようとしましたが、これも効果がないようです。

 protected override void OnException(ExceptionContext filterContext)
        {
            if (filterContext == null)
                base.OnException(filterContext);

            Logger.LogException(filterContext.Exception);

            if (filterContext.Exception is SqlException)
                {
                filterContext.Result = new ViewResult { ViewName = "DatabaseError" };
                }

            if (filterContext.Exception is SomeOtherException)
                {
                filterContext.Result = new ViewResult { ViewName = "Error" };
                }

            if (filterContext.HttpContext.IsCustomErrorEnabled)
                {
                filterContext.ExceptionHandled = true;
                filterContext.Result.ExecuteResult(this.ControllerContext);
                }
        }

jQueryMobile MVC4 以外のアプリケーションでこれらのメソッドを試してみると、期待どおりに動作しますが、モバイル アプリケーションでは動作しません!

なぜ、どのようにこれを機能させるのかについて、誰にも洞察がありますか??

4

2 に答える 2

0

リクエストが AJAX 経由である場合は、おそらくフィルターをチェックインして、 aJsonResultではなくa を返す必要があります。たとえばViewResult、次のようになります。

public class TypeSwitchingHandleErrorAttribute : HandleErrorAttribute
{
    private static readonly string[] AJAX_ACCEPT_TYPES = new[] { "application/json", "application/javascript", "application/xml" };

    private bool IsAjax(ExceptionContext filterContext)
    {
        return filterContext.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest"
            ||
            filterContext.HttpContext.Request.AcceptTypes.ContainsAny(AJAX_ACCEPT_TYPES);
    }

    private void setResult(ExceptionContext filterContext, object content)
    {
        if( IsAjax(filterContext) )
        {
            filterContext.Result = new JsonResult { Data = content, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
        } else
        {
            filterContext.Result = new ViewResult { ViewName = (string)content };
        }
    }

    public override void OnException(ExceptionContext filterContext)
    {
        // your code...then where you set the result...
        setResult(filterContext, "DatabaseError etc");
    }
}

次に、クライアント側で ajax 応答を適切に解釈する必要があります。標準オブジェクトなどの ajax リクエストの場合は、別のコンテンツを送信して{success: t/f, message: Exception.Message }、レスポンス ステータス コードを適切に設定することもできます。

于 2014-12-04T21:37:15.937 に答える
0

Ajax を無効にすると、適切なエラー ページが表示されるようになります。

私の _layout.cshtml ページに、次の JavaScript を追加しました。

 $.mobile.ajaxEnabled = false;
于 2012-11-19T19:32:05.050 に答える