我的第一篇帖子......
当我使用RedirectToAction时,浏览器中的网址不会更改。我怎样才能做到这一点?
使用Web表单10年后,我正在切换到ASP.NET MVC 3.0(也使用jQuery Mobile)。我大约需要8个星期的时间,经过几本书并搜索谷歌的答案后,我才会干涸。
我在Global.asax中定义了一条路线:
routes.MapRoute(
"Routes",
"{controller}/{action}/{id}",
new { controller = "Shopping", action = "Index", id = UrlParameter.Optional }
我有一个包含这些操作的ShoppingController:
public ActionResult Cart() {...}
public ActionResult Products(string externalId) {...}
[HttpPost]
public ActionResult Products(List<ProductModel> productModels)
{
// do stuff
return RedirectToAction("Cart");
}
当我执行get和post(使用具有RedirectToAction的帖子)时的URL总是:
/Shopping/Products?ExternalId=GenAdmin
在帖子和RedirectToAction之后,我希望浏览器中的网址更改为:
/Shopping/Cart
我尝试过Redirect和RedirectToRoute但得到的结果相同。
非常感谢任何帮助。
[更新] 我发现jQuery Mobile AJAX帖子是这里的罪魁祸首。如果我关闭jQuery Mobile的AJAX就行了。
<script type="text/javascript" src="http://code.jquery.com/jquery-1.6.4.min.js"></script>
<script type="text/javascript">
// do not handle links via ajax by default
$(document).bind("mobileinit", function () { $.mobile.ajaxEnabled = false; });
</script>
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.0rc2/jquery.mobile-1.0rc2.min.css" />
上述脚本的排序很重要。我必须首先将脚本包含在jQuery中,然后包含脚本以禁用jQuery Mobile使用AJAX,然后将脚本包含在jQuery Mobile中。
我仍然想找到一种方法来使用AJAX并正确更新网址。或至少能够调用jQuery Mobile的“加载”消息(或烘焙我自己的消息)。
答案 0 :(得分:36)
我想我找到了答案。隐藏在jQuery Mobile documentation深处,有关于使用data-url
在div上设置data-role="page"
的信息。当我这样做时,我得到了很好的jQuery Mobile AJAX内容(页面加载消息,页面转换)并且我在浏览器中正确更新了URL。
基本上,这就是我在做的事情......
[HttpPost]
public ActionResult Products(...)
{
// ... add products to cart
TempData["DataUrl"] = "data-url=\"/Cart\"";
return RedirectToAction("Index", "Cart");
}
然后在我的布局页面上我有这个......
<div data-role="page" data-theme="c" @TempData["DataUrl"]>
在我的HttpPost
操作中,我现在设置了TempData["DataUrl"]
,以便为这些页面设置并填充在布局页面上。 “获取”操作不会设置TempData [“DataUrl”],因此不会在这些位置的布局页面上填充它。
唯一不能解决这个问题的方法是,当您右键单击...查看源代码...在浏览器中,html并不总是针对您所在的页面,而不是AJAX很不寻常。
答案 1 :(得分:7)
不确定它是否仍然存在,但在我的情况下,我写了以下帮助方法
public static IHtmlString GetPageUrl<TModel>(this HtmlHelper<TModel> htmlHelper, ViewContext viewContext)
{
StringBuilder urlBuilder = new StringBuilder();
urlBuilder.Append("data-url='");
urlBuilder.Append(viewContext.HttpContext.Request.Url.GetComponents(UriComponents.PathAndQuery, UriFormat.UriEscaped));
urlBuilder.Append("'");
return htmlHelper.Raw(urlBuilder.ToString());
}
然后按如下方式使用它:
<div data-role="page" data-theme="d" @Html.GetPageUrl(ViewContext) >
这样我就不需要为每个重定向操作存储一个TempData。为Redirect和RedirectToAction做了很好的工作。如果你在控制器中使用方法“View()”并返回不同的视图名称,这将改变UI,但将保留url,这将无法正常工作。
希望它有所帮助 阿尔乔姆
答案 2 :(得分:5)
TempData["DataUrl"] = "data-url=/appName/controller/action";
return RedirectToAction("action", "controller");
作为旁注,我还发现当将值分配给TempData [“DataUrl”]时,我能够省略转义的引号并完全按照上面输入它,它似乎对我来说工作正常。再次感谢您的帮助。
答案 3 :(得分:0)
github上存在问题 https://github.com/jquery/jquery-mobile/issues/1571
它有一个很好的解决方案,不需要TempData