JQuery在Controller上调用Action(但之后没有重定向)

时间:2009-05-12 22:02:37

标签: jquery asp.net-mvc

我有一个JQuery确认弹出窗口,带有Yes,No按钮。是按钮调用此功能:

   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';");
    }

在这两种情况下,操作都会执行,但不会发生重定向到其他操作。为什么呢?

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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") + "';");

那会让你到那儿。

答案 2 :(得分:0)

我看到过Web服务重定向调用的问题,他们不会这样做。

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

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

答案 3 :(得分:0)

因为您正在使用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