Подтвердить что ты не робот

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 "Загрузка" сообщения (или испечь мою собственную).

4b9b3361

Ответ 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" ] мне удалось оставить скрытые кавычки и ввести его точно так же, как указано выше, и, похоже, он работает нормально для меня. Еще раз спасибо за вашу помощь.