web-dev-qa-db-ja.com

asp.net mvc 4のjquery ajax呼び出し後のサーバー側のリダイレクト

JQuery AJAX MVC 4コントローラーへの呼び出しからログイン情報を送信しています。

   $.post(url, data, function (response) {
      if (response=='InvalidLogin') {
          //show invalid login
      }
      else if (response == 'Error') {
          //show error
      }
      else {
          //redirecting to main page from here for the time being.
          window.location.replace("http://localhost:1378/Dashboard/Index");
      }
   });

ログインが成功した場合、ユーザーの種類に基づいて、サーバー側から適切なページにユーザーをリダイレクトします。ログインに失敗すると、文字列がユーザーに送り返されます。

    [HttpPost]
    public ActionResult Index(LoginModel loginData)
    {
        if (login fails)
        {
            return Json("InvalidLogin", JsonRequestBehavior.AllowGet);
        }
        else
        {
             // I want to redirect to another controller, view, or action depending
             // on user type.
        }
    }

しかし、問題があります:

  1. このメソッドが「ActionResult」を返す場合、エラーnot all code paths return a value

  2. 「void」を使用すると、何も返せません。

  3. 戻り値なしで「void」を使用しても、jQuery AJAX呼び出しの非同期性のために、他のコントローラーまたはビューにリダイレクトできません。

そのようなシナリオを処理するテクニックはありますか?

22
s.k.paul

returnは通常、メソッド内でそれ以上ステートメントを実行せずに戻るため、else部分は必要ありません。これにより、問題1を取り除くことができます。

リダイレクトについては、何らかの種類のredirectコマンドを返さない理由:

[HttpPost]
public ActionResult Index(LoginModel loginData)
{
    if (login fails)
    {
        return Json(new {result = "InvalidLogin"}, JsonRequestBehavior.AllowGet);
    }
    return Json(new {result = "Redirect", url = Url.Action("MyAction", "MyController")});
}

そして、javascriptで:

$.post(url, data, function (response) {
  if (response.result == 'InvalidLogin') {
      //show invalid login
  }
  else if (response.result == 'Error') {
      //show error
  }
  else if (response.result == 'Redirect'){
      //redirecting to main page from here for the time being.
      window.location = response.url;
  }
 });
49
Ramunas

これは私を助けます。

return JavaScript("window.location = '/'");

参照リンク 新しいページにリダイレクトするASP.NET MVC Ajax応答を取得する方法...

2
BJ Patel

私はこれをしなければなりませんでしたが、クライアントをログインページにリダイレクトするために回避しなければならなかったJavaScript解析エラーの極端な要件を本当に満たす解決策はありませんでした。

私がやったのは、カスタムAuthorization属性から単純な「NOAUTH」文字列応答を送信し、イベントハンドラーがヒットする前にAjax応答をインターセプトし、window.locationを設定してユーザーをリダイレクトすることでした。

サーバ側:

protected override void HandleUnauthorizedRequest(AuthorizationContext context)
{
    if (context.RequestContext.HttpContext.Request.IsAjaxRequest())
    {
        var result = new ContentResult {Content = "NOAUTH"};
        context.Result = result;
        return;
    }
}

次に、クライアント側で:

$.ajaxSetup({
    dataFilter: function (data, type) {
        if (data !== "" && data === "NOAUTH") {
            window.location = '/';
        }
        return data;
    }
});

ただし、このアプローチはお勧めしません。これを行う必要がある場合は、代わりにhttp応答ヘッダー内に「NOAUTH」値を入れてから、グローバルJQuery completeハンドラーで値を読み取ることを少なくともお勧めします。

サーバ側:

HttpContext.Current.Response.AddHeader("NOAUTH", "1");

クライアント側:

$.ajaxSetup({
    complete: function (jqXHR, textStatus) {
        if (jqXHR.getResponseHeader("NOAUTH") === '1')
            window.location = '/';
    }
});

DataFilterの使用は、他のイベントハンドラがヒットする前にajaxリクエストをインターセプトするonlyの方法であることに注意してください。

0
Shahin Dohan