ajax调用后MVC3重定向到动作

时间:2012-04-16 16:28:58

标签: asp.net-mvc-3 jquery redirect

在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 () {
                    }
                }
            });
        }

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

我该怎么做?

我尝试在return RedirectToAction("Stores","Store")函数末尾的控制器中使用SaveItems。但它不起作用

我还尝试在ajax调用的完整函数中添加window.location.replace("/Store/Stores");但是无法正常工作

非常感谢任何帮助

非常感谢

3 个答案:

答案 0 :(得分:24)

您可以使用javascript重定向到新页面。将window.location.href的值设置为ajax调用的success / complete事件中的新网址。

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帮助器方法为action方法构建正确的相对url。如果你的javascript代码在外部javascript文件中,你应该为app root构建url并将其传递给外部js文件中的脚本/代码,并使用它来构建动作方法的url,如{{3}中所述}。

传递参数?

如果要将一些查询字符串参数传递给新网址,可以使用接受路由值的Url.Action方法的this post来构建包含查询字符串的网址。

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

其中2和5可以替换为其他一些实际值。

由于这是一个html辅助方法,它只能在你的剃刀视图中工作,而不能在外部js文件中工作。如果您的代码在外部js文件中,则需要手动构建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 });            
}

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

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

答案 1 :(得分:7)

在行动中你可以这样写:

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

答案 2 :(得分:2)

尝试

window.location = "/Store/Stores";

相反。