1

AJAXから関数を呼び出しています

$.ajax({
         type: "POST",
         url: "GetOneApple",
         data: {},
         dataType: "json",
         success: function (data) {}
});

ホームコントローラー:

[HttpPost]
public ActionResult GetOneApple()
{
     try
       {
      ..snip
       }
     catch (Exception e)
       {
           return RedirectToAction("ErrorPage", "Home");
       }
}

キャッチブロックでは、これも試しました:

return new RedirectToRouteResult(new RouteValueDictionary {
    { "Controller", "Home" }, 
    { "Action", "ErrorPage" }
});

私はこのようなErrorPageコントローラを持っています

 public ActionResult ErrorPage()
        {
            return View();
        }

前述のように、try ブロックでエラーが発生した場合は、ErrorPage
にリダイレクトする必要がありますが、ページがリダイレクトされてません。

私は何が欠けていますか?私はこれに慣れていないので、見つけられなかった簡単な答えがあることを願っています...

4

2 に答える 2

2

あなたは2つの概念を混同しています:

  1. AJAX 呼び出しによって消費される REST インターフェイス
  2. エラー ページに移動する Web アプリケーション。

REST API は常にリクエストに応答する必要があり、クライアントにリダイレクトを要求しないでください。代わりに、エラーが発生した場合は、エラーの詳細を JSON 形式で返します。

{ status: "error", message: "Error so and so" }

エラー HTTP コードとともに。これは次のように達成できます。

catch (Exception ex)
{
    Response.StatusCode = 500; // put a reasonable code here
    return Json(new { status = "error", message = ex.Message });
}

JavaScript では、AJAX でエラー コールバックを使用してそれを「キャッチ」できます。次に、JavaScript が次に何をするかを決定します。エラーをユーザーに表示する場合は、JavaScript を使用してメッセージを HTML としてレンダリングできます。

(注意: 通常、ページ全体のリクエストが無効な場合にのみ、ブラウザをエラー ページにリダイレクトします。有効なページにいて、AJAX 呼び出しが 1 つだけ失敗している場合は、有効なページをアンロードしてページに移動する必要はありません。エラーページの URL(?). ブラウザが失敗したページリクエストを行ったとしても, 私は通常, ブラウザを「エラーページ」にリダイレクトするよりも, まさにその URL からエラー応答をレンダリングすることを好みます. その理由は, リダイレクトがたとえば、ユーザーが「更新」ボタンをクリックして再試行したい場合、ブラウザは以前にエラーを引き起こしたのと同じことをやり直しません。代わりに、単にリロードします。元のユース ケースが機能する可能性がある場合でも、エラー ページが表示されます)。

于 2014-01-17T11:36:39.220 に答える
1

ここに示すように、エラーを返して失敗を処理できませんか (ページの最後の例から 2 番目を参照)。次に、このようなものを使用してリダイレクトします。

ストレートな RedirectToAction が機能するはずです。適切なコントローラーをターゲットにしていると仮定すると、try キャッチにフラグを設定して、キャッチの外側にリダイレクトすることができます。

私は RedirectToRouteResult を使用しない傾向がありますが、いつ使用するかについての質問はここで回答されています。

申し訳ありませんが、「これを行うとすべてがうまくいく」という答えではありませんが、正しい方向に役立つことを願っています.

于 2014-01-17T11:27:08.960 に答える