coa*_*rob 5 asp.net-mvc routes asp.net-mvc-4
我正在使用"重定向后发布"(http://en.wikipedia.org/wiki/Post/Redirect/Get)模式来解决它解决的刷新问题,但我没有看到URL更改后POST和随后的GET.
这是我的设置:
我有一个表格,有一些非常广泛的客户端验证,然后提交.
@using (Html.BeginForm("AddItem", "Order", FormMethod.Post, new { Id = "addItemForm" }))
{
// form stuff
}
Run Code Online (Sandbox Code Playgroud)
客户端验证:
$('#addToOrder').click(function () {
// do a bunch of validation stuff.
}
if (criteriaMet) {
$('#addItemForm').submit();
}
Run Code Online (Sandbox Code Playgroud)
"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);
}
}
Run Code Online (Sandbox Code Playgroud)
从POST操作(AddItem)重定向后,我可以通过GET操作将其返回到返回(任一个).我希望在浏览器的URL毕竟这是http://mydomain.com/NamedRoute/NamedRouteAction但它是http://mydomain.com/Order/AddItem.为什么是这样?RedirectToRoute不应该更改URL吗?
我错过了什么?
我怀疑控制器动作是以某种方式使用AJAX请求调用的.例如,如果您使用jQuery Mobile或其他东西,可能会发生这种情况.或者也许还有其他一些你编写过的脚本 - 它劫持了表单提交并发送了一个AJAX请求.因为它是一个AJAX请求,所以你不可能期望客户端浏览器中的url会发生变化 - 这就是AJAX的重点 - 保持在同一页面上.
通过使用诸如FireBug之类的javascript调试工具,可以非常轻松地验证这一点.只需查看"网络"选项卡,查看POST请求是否为AJAX请求.在Net选项卡中找到请求,看看是否有以下请求标头:
X-Requested-With: XMLHttpRequest
Run Code Online (Sandbox Code Playgroud)
jQuery将此HTTP标头附加到它发送的所有AJAX请求中.
因此,基本上如果您希望在POST请求之后发生重定向,则不应使用AJAX来提交表单.或者更确切地说:重定向发生在服务器端(再一次,您将能够在FireBug中看到它 - 302状态代码),然后XMLHttpRequest只是遵循此重定向,但客户端浏览器不会更改其当前位置.
| 归档时间: |
|
| 查看次数: |
2868 次 |
| 最近记录: |