ajax调用后MVC3重定向到动作

You*_*sef 17 jquery redirect asp.net-mvc-3

在ASP.NET MVC3应用程序中,我在视图中有一个按钮.

单击该按钮时,将调用一个函数,并进行jquery ajax调用以将项目保存到数据库

    function SaveMenuItems() {
        var encodeditems = $.toJSON(ids);;
        $.ajax({
            type: 'POST',
            url: '@Url.Action("SaveItems", "Store")',
            data: 'items=' + encodeditems + '&storeKey=@Model.StoreID',
            complete: function () {
                    }
                }
            });
        }
Run Code Online (Sandbox Code Playgroud)

我想要的是将项目保存到数据库后我想重定向到另一个视图.(重定向到行动)

我怎样才能做到这一点?

我试着return RedirectToAction("Stores","Store")SaveItems函数末尾的控制器中使用.但它没有用

我也尝试添加window.location.replace("/Store/Stores");ajax调用的完整功能,但也没有工作

任何帮助是极大的赞赏

非常感谢

Shy*_*yju 25

您可以使用javascript重定向到新页面.window.location.href在ajax调用的success/ completeevent中设置新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!');
    }
});
Run Code Online (Sandbox Code Playgroud)

或者在done事件中

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

上面的代码使用Url.Actionhelper方法为action方法构建正确的相对url.如果你的JavaScript代码是一个外部JavaScript文件中,你应该建立链接到应用程序根并传递到内外部的js文件的脚本/代码,并用它来建立的URL操作方法在解释这个职位.

传递参数?

如果要将一些查询字符串参数传递给新网址,可以使用接受路由值的方法的此重载Url.Action以及使用查询字符串构建网址.

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

其中2和5可以用其他一些实际值替换.

由于这是一个html辅助方法,它只能在你的剃刀视图中工作,而不能在外部js文件中工作.如果您的代码在外部js文件中,则需要手动构建url querystring参数.

在服务器端生成新URL

使用mvc helper方法为action方法生成正确的url总是一个好主意.从您的action方法中,您可以返回一个json结构,该结构具有要重定向的新url的属性.

您可以使用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 });            
}
Run Code Online (Sandbox Code Playgroud)

现在在你的ajax调用success/ done回调中,只需检查返回值并根据需要重定向.

.done(function(result){
   if(result.status==="success")
   {
      window.location.href=result.redirectUrl;
   }
   else
   {
      // show the error message to user
   }
});
Run Code Online (Sandbox Code Playgroud)


小智 7

在行动中你可以这样写:

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