2012-12-31 50 views
4

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

这里是我的设置:

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

@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),I可以通过GET动作步骤的东西重定向后退货(任一)。我希望浏览器中的所有网址都是http://mydomain.com/NamedRoute/NamedRouteAction,但是它的网址是http://mydomain.com/Order/AddItem。为什么是这样? RedirectToRoute不应该更改URL吗?

我错过了什么?

回答

6

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

这可以通过使用JavaScript调试工具(如FireBug)轻松验证。只需查看“网络”选项卡,查看POST请求是否为AJAX请求。在Net选项卡中找到所求,看是否有下面的请求头:

X-Requested-With: XMLHttpRequest 

jQuery的这个附加HTTP头到所有Ajax请求发送。

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

+1

这就是问题所在,你不知何故,jQuery手机是罪魁祸首。此外,jQuery手机有这个很酷的小数据参数(data-ajax =“false”),可以“关闭”这种行为。 –

+0

太棒了!非常感谢你们,这非常有用! – hhh