ajax调用后MVC3重定向到动作
在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 () { } } }); }
我想要的是将项目保存到数据库后我想重定向到另一个视图。 (重定向到行动)
我怎样才能做到这一点?
我试图在SaveItems
函数末尾的控制器中使用return RedirectToAction("Stores","Store")
。 但它没有用
我还尝试添加window.location.replace("/Store/Stores");
在ajax调用的完整function,但也没有工作
任何帮助是极大的赞赏
非常感谢
您可以使用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
帮助器方法为action方法构建正确的相对url。 如果你的javascript代码在一个外部javascript文件中,你应该建立应用程序根目录的url并将其传递给外部js文件中的脚本/代码,并使用它来构建操作方法的url,如本文所述。
传递参数?
如果你想将一些查询字符串参数传递给新的url,你可以使用Url.Action
方法的这个重载 ,它接受routevalues以及使用查询字符串构建url。
var newUrl = '@Url.Action("Stores","Store", new { productId=2, categoryId=5 })';
其中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 }); }
现在在你的ajax调用的success
/ done
回调中,只需检查返回值并根据需要重定向。
.done(function(result){ if(result.status==="success") { window.location.href=result.redirectUrl; } else { // show the error message to user } });
在行动中你可以这样写:
if(Request.IsAjaxRequest()) { return JavaScript("document.location.replace('"+Url.Action("Action", new { ... })+"');"); // (url should be encoded...) } else { return RedirectToAction("Action", new { ... }); }
尝试
window.location = "/Store/Stores";
代替。