【问题标题】:MVC3 redirect to action after ajax callajax调用后MVC3重定向到动作
【发布时间】:2012-04-16 16:28:57
【问题描述】:

在 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")。但它不起作用

我也尝试在 ajax 调用的完整函数中添加window.location.replace("/Store/Stores");,但也没有用

非常感谢任何帮助

非常感谢

【问题讨论】:

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


【解决方案1】:

您可以使用 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,如 this post 中所述。

传递参数?

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

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

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

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

在服务器端生成新的 url

使用 mvc 辅助方法生成动作方法的正确 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
   }
});

【讨论】:

  • 谢谢你成功了。如果你有时间,你能告诉我如何使用带参数的动作吗?如何传递她的参数?
  • @Youssef:我不认为你可以像使用剃刀一样从 javascript 传递参数。您需要为此构建一个硬编码的网址。
【解决方案2】:

实际上你可以这样写:

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

【讨论】:

  • 如果是 Ajax 发起请求或纯 MVC 请求,实际上是一个不错的组合解决方案。
  • 使用javascript返回后,浏览器的后退按钮不再起作用或者它只是来自我?
【解决方案3】:

试试

window.location = "/Store/Stores";

相反。

【讨论】:

    猜你喜欢
    • 2012-04-24
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-30
    相关资源
    最近更新 更多