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.
}
}
しかし、問題があります:
このメソッドが「ActionResult」を返す場合、エラーnot all code paths return a value
。
「void」を使用すると、何も返せません。
戻り値なしで「void」を使用しても、jQuery AJAX呼び出しの非同期性のために、他のコントローラーまたはビューにリダイレクトできません。
そのようなシナリオを処理するテクニックはありますか?
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;
}
});
これは私を助けます。
return JavaScript("window.location = '/'");
私はこれをしなければなりませんでしたが、クライアントをログインページにリダイレクトするために回避しなければならなかった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の方法であることに注意してください。