Dav*_*man 28 asp.net-mvc-routing jquery-mobile asp.net-mvc-3
我的第一篇文章......
当我使用RedirectToAction时,浏览器中的url不会更改.我怎样才能做到这一点?
使用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 }
Run Code Online (Sandbox Code Playgroud)
我有一个包含以下操作的ShoppingController:
public ActionResult Cart() {...}
public ActionResult Products(string externalId) {...}
[HttpPost]
public ActionResult Products(List<ProductModel> productModels)
{
// do stuff
return RedirectToAction("Cart");
}
Run Code Online (Sandbox Code Playgroud)
当我进行get和post(带有RedirectToAction的帖子)时的url总是:
/Shopping/Products?ExternalId=GenAdmin
Run Code Online (Sandbox Code Playgroud)
在post和RedirectToAction之后,我希望浏览器中的url更改为:
/Shopping/Cart
Run Code Online (Sandbox Code Playgroud)
我尝试过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" />
Run Code Online (Sandbox Code Playgroud)
上述脚本的顺序很重要.我必须首先将脚本包含到jQuery中,然后包含脚本以禁用jQuery Mobile使用AJAX,然后将脚本包含到jQuery Mobile中.
我仍然想找到一种方法来使用AJAX并正确更新网址.或至少能够调用jQuery Mobile的"加载"消息(或烘焙我自己的消息).
Dav*_*man 36
我想我找到了答案.深入研究jQuery Mobile文档,有关于设置data-urldiv的信息data-role="page".当我这样做时,我得到了漂亮的jQuery Mobile AJAX内容(页面加载消息,页面转换)并且我在浏览器中正确更新了URL.
从本质上讲,这就是我在做的事情......
[HttpPost]
public ActionResult Products(...)
{
// ... add products to cart
TempData["DataUrl"] = "data-url=\"/Cart\"";
return RedirectToAction("Index", "Cart");
}
Run Code Online (Sandbox Code Playgroud)
然后在我的布局页面上我有这个....
<div data-role="page" data-theme="c" @TempData["DataUrl"]>
Run Code Online (Sandbox Code Playgroud)
在我的HttpPost操作中,我现在TempData["DataUrl"]为它设置的那些页面设置了so,并在布局页面上填充."获取"操作不会设置TempData ["DataUrl"],因此不会在这些位置的布局页面上填充它.
唯一不能解决这个问题的是,当你右键单击...查看源代码...在浏览器中,html并不总是适用于你所在的页面,这对于AJAX来说并不罕见.
小智 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());
}
Run Code Online (Sandbox Code Playgroud)
然后使用如下:
<div data-role="page" data-theme="d" @Html.GetPageUrl(ViewContext) >
Run Code Online (Sandbox Code Playgroud)
这样我就不需要为每个重定向操作存储一个TempData.为Redirect和RedirectToAction做了很好的工作.如果你在控制器中使用方法"View()"并返回不同的视图名称,这将改变UI,但将保留url,这将无法正常工作.
希望它能帮助Artem
大卫,这对我来说是一个很大的帮助.我只想补充一点,在我的情况下,我必须使用以下格式让Url以正确的形式显示为我的其他网址:
TempData["DataUrl"] = "data-url=/appName/controller/action";
return RedirectToAction("action", "controller");
Run Code Online (Sandbox Code Playgroud)
作为附注,我还发现,当将值分配给TempData ["DataUrl"]时,我能够省略转义的引号并完全按照上面输入它,它似乎对我来说工作正常.再次感谢你的帮助.
| 归档时间: |
|
| 查看次数: |
13174 次 |
| 最近记录: |