【问题标题】:Redirect after POST doesn't change URLPOST 后重定向不会更改 URL
【发布时间】:2012-12-15 07:09:14
【问题描述】:

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

我错过了什么?

【问题讨论】:

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


    【解决方案1】:

    我怀疑控制器操作是通过 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 只是遵循此重定向,但客户端浏览器不会更改其当前位置。

    【讨论】:

    • 这正是问题所在,而且,您不知何故认为 jQuery mobile 是罪魁祸首。另外,jQuery mobile 有一个很酷的小数据参数 (data-ajax="false") 可以“关闭”这种行为。
    • 太棒了!非常感谢你们,这非常有用!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 2016-07-23
    • 2012-06-09
    相关资源
    最近更新 更多