jQuery Mobile / MVC:使用RedirectToAction获取浏览器URL

时间:2011-10-19 15:56:11

标签: asp.net-mvc-3 jquery-mobile asp.net-mvc-routing

我的第一篇帖子......

当我使用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的“加载”消息(或烘焙我自己的消息)。

4 个答案:

答案 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)

大卫,这对我来说是一个很大的帮助。我只想补充一点,在我的情况下,我必须使用以下格式让Url以正确的形式显示为我的其他网址:

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