5

我正在使用“发布后重定向”(http://en.wikipedia.org/wiki/Post/Redirect/Get)模式来解决它所解决的刷新问题,但之后我没有看到 URL 更改POST 和随后的 GET。

这是我的设置:

我有一个带有一些相当广泛的客户端验证的表单,然后提交。

@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();
}

“添加项目”控制器:

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 操作逐步返回(其中一个)。在所有这些之后,我希望浏览器中的 URL 是http://mydomain.com/NamedRoute/NamedRouteAction但它是http://mydomain.com/Order/AddItem。为什么是这样?RedirectToRoute 不应该更改 URL 吗?

我错过了什么?

4

1 回答 1

8

我怀疑控制器操作是通过 AJAX 请求以某种方式调用的。例如,如果您使用 jQuery Mobile 或其他东西,这可能会发生。或者您可能编写了其他一些脚本来执行此操作 - 它劫持表单提交并发送 AJAX 请求。由于它是一个 AJAX 请求,因此您不可能期望客户端浏览器中的 url 会发生变化——这就是 AJAX 的全部意义——保持在同一页面上。

这可以通过使用 javascript 调试工具(例如 FireBug)很容易地验证。只需查看 Network 选项卡并查看 POST 请求是否是 AJAX 请求。在Net选项卡中找到请求并查看是否有以下请求标头:

X-Requested-With: XMLHttpRequest

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

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

于 2012-12-31T10:08:00.467 回答