JQuery Mobile/MVC: изменение URL-адреса браузера с помощью RedirectToAction
Мой первый пост...
Когда я использую RedirectToAction, URL-адрес в браузере не изменяется. Как я могу достичь этого?
Я перехожу к ASP.NET MVC 3.0 (также используя jQuery Mobile) через 10 лет, используя веб-формы. Мне около 8 недель, и после нескольких книг и чистки Google для ответа я подхожу на сухую.
У меня есть один маршрут, определенный в 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");
}
URL-адрес, когда я делаю сообщение get и post (с сообщением, имеющим RedirectToAction), всегда:
/Shopping/Products?ExternalId=GenAdmin
После сообщения и RedirectToAction я хочу, чтобы URL-адрес браузера изменился на:
/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="#" onclick="location.href='http://code.jquery.com/mobile/1.0rc2/jquery.mobile-1.0rc2.min.css'; return false;" />
Приоритет приведенных выше сценариев важен. Сначала я должен был включить script в jQuery, затем включить script, чтобы отключить использование JQuery Mobile AJAX, а затем включить script в jQuery Mobile.
Мне все равно хотелось бы найти способ использовать AJAX и правильно обновить url. Или, по крайней мере, можно вызвать jQuery Mobile "Загрузка" сообщения (или испечь мою собственную).
Ответы
Ответ 1
Я думаю, что нашел ответ. Погруженный глубоко в 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.
Ответ 2
Не уверен, что это все еще актуально, но в моем случае я написал следующий вспомогательный метод
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()" внутри контроллера и возвращаете другое имя представления, которое изменит интерфейс, но сохранит URL-адрес.
Надеюсь, что это поможет
Артем
Ответ 3
Дэвид, это очень помогло мне. Я просто хотел добавить, что в моем случае мне пришлось использовать следующий формат, чтобы отобразить Url в правильной форме, как и мой другой URL:
TempData["DataUrl"] = "data-url=/appName/controller/action";
return RedirectToAction("action", "controller");
В качестве побочного примечания я также обнаружил, что при назначении значения TempData [ "DataUrl" ] мне удалось оставить скрытые кавычки и ввести его точно так же, как указано выше, и, похоже, он работает нормально для меня. Еще раз спасибо за вашу помощь.
Ответ 4
Существует проблема с github
https://github.com/jquery/jquery-mobile/issues/1571
У этого есть хорошее решение без необходимости TempDatap >