POST后重定向不会更改URL

时间:2012-12-31 00:44:25

标签: asp.net-mvc asp.net-mvc-4 routes

我正在使用"重定向后发布" (http://en.wikipedia.org/wiki/Post/Redirect/Get)模式解决了它解决的刷新问题,但是在POST和后续GET之后我没有看到URL的变化。

这是我的设置:

我有一个表格,其中有一些非常广泛的客户端验证,然后提交。

@using (Html.BeginForm("AddItem", "Order", FormMethod.Post, new { Id = "addItemForm" })) 
{
    // form stuff
}

客户端验证:

$('#addToOrder').click(function () {
    // do a bunch of validation stuff.
}

if (criteriaMet) {
    $('#addItemForm').submit();
}

"的AddItem"控制器:

public class OrderController {

[HttpPost]
public ActionResult AddItem(long? orderId, long menuItemId) 
{
    if (oneConditionIsTrue)
    {
        return RedirectToRoute("NamedRoute1", new { RouteValueDictionary values });
    }
    else
    { 
        return RedirectToRoute("NamedRoute2", new { RouteValueDictionary values });
    }
}

public class NamedRouteController
{
    public ActionResult NamedRouteAction
    {
        // do some stuff
        if (mobile)
        {
            return View("MobileView", model);
        }
        else
        {
            return View("RegularView", model);
        }
}

从POST操作(AddItem)重定向后,我可以通过GET操作将其返回到返回(任一个)。我希望在所有这些内容之后,浏览器中的网址为http://mydomain.com/NamedRoute/NamedRouteAction,但它是http://mydomain.com/Order/AddItem。为什么是这样? RedirectToRoute不应该更改URL吗?

我错过了什么?

1 个答案:

答案 0 :(得分:7)

我怀疑控制器操作是以某种方式使用AJAX请求调用的。例如,如果您使用jQuery Mobile或其他东西,可能会发生这种情况。或者也许还有其他一些你编写过的脚本 - 它劫持了表单提交并发送了一个AJAX请求。因为它是一个AJAX请求,所以你不可能期望客户端浏览器中的url会发生变化 - 这就是AJAX的重点 - 保持在同一页面上。

使用javascript调试工具(如FireBug)可以非常轻松地验证这一点。只需查看“网络”选项卡,查看POST请求是否为AJAX请求。在Net标签中找到请求,看看是否有以下请求标头:

X-Requested-With: XMLHttpRequest

jQuery将此HTTP标头附加到它发送的所有AJAX请求中。

所以基本上如果您希望在POST请求之后发生重定向,则不应使用AJAX来提交表单。或者更确切地说:重定向发生在服务器端(再一次,您将能够在FireBug中看到它 - 302状态代码),然后XMLHttpRequest只是遵循此重定向,但客户端浏览器不会更改其当前位置。