17

在 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。但它不工作

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

任何帮助是极大的赞赏

非常感谢

4

3 回答 3

25

您可以使用 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 到 action 方法。如果您的 javascript 代码位于外部 javascript 文件中,您应该将 url 构建到应用程序根目录并将其传递给外部 js 文件中的脚本/代码,并使用它来构建操作方法的 url,如本文所述。

传递参数?

如果你想将一些查询字符串参数传递给新的 url,你可以使用这个方法的重载Url.Action它也接受路由值来构建带有查询字符串的 url。

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

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

由于这是一个 html 辅助方法,它只能在您的 razor 视图中工作,而不是在外部 js 文件中。如果您的代码在外部 js 文件中,则需要手动构建 url 查询字符串参数。

在服务器端生成新的 url

使用 mvc 辅助方法为 action 方法生成正确的 url 总是一个好主意。从您的操作方法中,您可以返回一个 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
   }
});
于 2012-04-16T16:34:49.653 回答
8

在行动中,你可以这样写:

if(Request.IsAjaxRequest()) {
    return JavaScript("document.location.replace('"+Url.Action("Action", new { ... })+"');");  // (url should be encoded...)
} else {
    return RedirectToAction("Action", new { ... });
}
于 2014-02-02T12:07:59.517 回答
2

尝试

window.location = "/Store/Stores";

反而。

于 2012-04-16T16:32:10.430 回答