我有一个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';");
}
在这两种情况下,操作都会执行,但不会发生重定向到其他操作。为什么呢?
答案 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。