web-dev-qa-db-ja.com

MVC3はajax呼び出し後にアクションにリダイレクトします

ASP.NET MVC3アプリケーションでは、ビューにボタンがあります。

ボタンがクリックされると関数が呼び出され、jquery ajax呼び出しが行われてデータベースにアイテムが保存されます

_    function SaveMenuItems() {
        var encodeditems = $.toJSON(ids);;
        $.ajax({
            type: 'POST',
            url: '@Url.Action("SaveItems", "Store")',
            data: 'items=' + encodeditems + '&[email protected]',
            complete: function () {
                    }
                }
            });
        }
_

アイテムがデータベースに保存された後、別のビューにリダイレクトする必要があります。 (アクションにリダイレクト)

どうやってやるの?

SaveItems関数の最後のコントローラーでreturn RedirectToAction("Stores","Store")を使用しようとしました。しかし、それは機能していません

また、ajax呼び出しの完全な関数にwindow.location.replace("/Store/Stores");を追加しようとしましたが、どちらも機能しませんでした

どんな助けでも大歓迎です

どうもありがとう

17
Youssef

JavaScriptを使用して、新しいページにリダイレクトできます。 window.location.hrefの値をajax呼び出しのsuccess/completeイベントの新しいURLに設定します。

var saveUrl = '@Url.Action("SaveItems","Store")';
var newUrl= '@Url.Action("Stores","Store")';

$.ajax({
    type: 'POST',
    url: saveUrl,
    // Some params omitted 
    success: function(res) {
        window.location.href = newUrl;
    },
    error: function() {
        alert('The worst error happened!');
    }
});

またはdoneイベント

$.ajax({      
    url: someVariableWhichStoresTheValidUrl
}).done(function (r) {
     window.location.href = '@Url.Action("Stores","Store")';
});

上記のコードは、Url.Actionヘルパーメソッドを使用して、アクションメソッドへの正しい相対URLを作成しています。 JavaScriptコードが外部JavaScriptファイル内にある場合は、アプリのルートへのURLを作成し、それを外部のJSファイル内のスクリプト/コードに渡し、それを使用して この投稿

パラメータを渡しますか?

一部のクエリ文字列パラメーターを新しいURLに渡したい場合は、ルート値を受け入れるUrl.Actionメソッドの this overload を使用して、クエリ文字列でURLを作成できます。

var newUrl = '@Url.Action("Stores","Store", new { productId=2, categoryId=5 })';

ここで、2と5は他の実際の値に置き換えることができます。

これはhtmlヘルパーメソッドであるため、かみそりビューでのみ機能し、外部のjsファイルでは機能しません。コードが外部jsファイル内にある場合は、urlクエリ文字列パラメーターを手動で作成する必要があります。

サーバー側で新しいURLを生成する

アクションメソッドへの正しいURLを生成するために、mvcヘルパーメソッドを利用することは常に良い考えです。アクションメソッドから、リダイレクトする新しいURLのプロパティを持つjson構造体を返すことができます。

これを行うには、コントローラ内でUrlHelperクラスを使用できます。

[HttpPost]
public ActionResult Step8(CreateUser model)
{
  //to do : Save
   var urlBuilder = new UrlHelper(Request.RequestContext);
   var url = urlBuilder.Action("Stores", "Store");
   return Json(new { status = "success", redirectUrl = url });            
}

Ajax呼び出しのsuccess/doneコールバックで、戻り値を確認し、必要に応じてリダイレクトします。

.done(function(result){
   if(result.status==="success")
   {
      window.location.href=result.redirectUrl;
   }
   else
   {
      // show the error message to user
   }
});
25
Shyju

実際にこれを書くことができます:

if(Request.IsAjaxRequest()) {
    return JavaScript("document.location.replace('"+Url.Action("Action", new { ... })+"');");  // (url should be encoded...)
} else {
    return RedirectToAction("Action", new { ... });
}
7
faisale

試す

window.location = "/Store/Stores";

代わりに。

2
Spencer Ruport