【问题标题】:JQuery calling Action on Controller (But not redirecting after)JQuery 在控制器上调用动作(但之后不重定向)
【发布时间】:2009-05-12 22:02:36
【问题描述】:

我有一个 JQuery 确认弹出窗口,带有是,否按钮。 Yes 按钮调用此函数:

   function doStuff() {
            $('#confirmPopup').dialog("close");
            var someKey = $("#someKey")[0].value;
            $.post("/MYController/MyAction", { someKey : someKey },
           function(responseText, textStatus, XMLHttpRequest) {

            });
            return false;
        }

这成功调用了我的控制器操作(2 次不同的尝试):

 public ActionResult MyAction(int someKey)
 {
     //do stuff
     return RedirectToAction("OtherAct", "OtherCont");
}



 public JavaScriptResult MyAction(int someKey)
     {
         //do stuff
         return JavaScript("Window.location.href='OtherCont/OtherAct';");
    }

在这两种情况下,动作都会被执行,但不会重定向到另一个动作。为什么?

【问题讨论】:

    标签: jquery asp.net-mvc


    【解决方案1】:

    因为您无法从异步调用的操作 ($.post) 中重定向。寻找 here 的替代方案。

    【讨论】:

      【解决方案2】:

      OtherContController 上的OtherAct ... 是否用[AcceptVerbs(HttpVerbs.Post)] 修饰?

      如果是这样,这是您的第一个问题。您返回 JavaScriptResult 的操作将起作用。但是,如果该操作使用 HttpVerbs.Post 进行修饰,则没有针对该操作的 Get 操作,并且 Ajax 调用得到 404 not found。当然,由于它是异步发生的,因此您无法知道这一点。不会显示任何错误消息。

      第二个问题比较简单。你说...

      return JavaScript("Window.location.href='OtherCont/OtherAct';")
      

      ...当你的意思是...

      return JavaScript("window.location.href='OtherCont/OtherAct';")
      

      ...或者更准确地说...

      return JavaScript("window.location.href='" + 
             Url.Action("OtherAct", "OtherCont") + "';");
      

      这应该可以让你到达那里。

      【讨论】:

        【解决方案3】:

        我看到了 Web 服务重定向调用的问题,它们无法以这种方式工作。

        另一种方法是将要重定向的 url 发送回客户端,然后使用 Javascript 进行重定向 (Window.location.href = ....)

        或者,只需执行 HTML 提交而不是 Web 服务调用。

        【讨论】:

          【解决方案4】:

          因为您使用的是 ajax,这意味着来自操作的重定向将被忽略。

          重定向调用的解决方案可能是创建另一个使用普通 FORM POST 而没有 ajax 的帮助程序。然后整个页面将 POST 并且操作将重定向。

          这是我的助手的一部分,正是这样做的:

                  string deleteLink = String.Format(@"<a onclick=""deleteRecord({0})"" href='#'>Delete</a><form id='deleteForm' method='post' action='" +
                       routeRelativePath + "/" + actionPrefix + "Delete/" + model.ID +
                      @"'></form>", model.ID);
          

          .. more 在上面。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-11-28
            • 1970-01-01
            • 2012-09-14
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多