jQuery Mobile / MVC: изменение URL браузера с помощью RedirectToAction - PullRequest
28 голосов
/ 19 октября 2011

Мой первый пост ...

Когда я использую 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, когда я делаю получение и публикацию (с публикацией, имеющей RedirectToAction) всегда:

/Shopping/Products?ExternalId=GenAdmin

Послесообщение и RedirectToAction Я хочу, чтобы URL-адрес в браузере изменился на:

/Shopping/Cart

Я пробовал Redirect и RedirectToRoute, но получаю те же результаты.

Любая помощь будет принята с благодарностью.

[Обновление] Я обнаружил, что сообщения JQuery Mobile AJAX являются виновником здесь.Если я отключу AJAX от jQuery Mobile, он будет работать.

<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, затем включить сценарий, чтобы отключить использование AJAX в jQuery Mobile, а затем включить сценарий в jQuery Mobile.

Я все же хотел бы найти способ использовать AJAX иURL обновляется правильно.Или, по крайней мере, иметь возможность вызывать «загрузочное» сообщение jQuery Mobile (или выпекать мое собственное).

Ответы [ 4 ]

36 голосов
/ 28 октября 2011

Я думаю, что нашел ответ.Глубоко в документации jQuery Mobile есть информация о настройке 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"], поэтому для этих страниц он получаетустановить и заполняется на странице макета.Действия «Get» не устанавливают TempData [«DataUrl»], поэтому он не заполняется на странице макета в таких ситуациях.

Единственное, что не совсем с этим работает, это когдаВы щелкаете правой кнопкой мыши ... просматриваете источник ... в браузере, html не всегда для страницы, на которой вы находитесь, что не является необычным для AJAX.

7 голосов
/ 13 декабря 2012

Не уверен, что это все еще актуально, но в моем случае я написал следующий вспомогательный метод

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.

Надеюсь, это поможет Артем

5 голосов
/ 25 июля 2012

Дэвид, это мне очень помогло.Я просто хотел добавить, что в моем случае мне пришлось использовать следующий формат, чтобы URL отображался в правильной форме, как другие мои URL:

TempData["DataUrl"] = "data-url=/appName/controller/action";      
return RedirectToAction("action", "controller");

В качестве примечания, я также обнаружил, что когдаприсваивая значение TempData ["DataUrl"], я смог опустить экранированные кавычки и ввести его точно так же, как указано выше, и мне кажется, что он работает нормально.Еще раз спасибо за вашу помощь.

0 голосов
/ 26 февраля 2013

Есть проблема на github https://github.com/jquery/jquery-mobile/issues/1571

У него есть хорошее решение без необходимости TempData

...