Умный способ обработки URL-адресов возврата в среде MVC

StackOverflow https://stackoverflow.com/questions/7382651

  •  29-10-2019
  •  | 
  •  

Вопрос

Проблема, с которой я сталкиваюсь снова и снова, связана с обработкой перенаправления на предыдущую страницу после того, как пользователь выполнит какое-либо действие, например щелкнет ссылку «Назад к ...» или сохранит запись, которую он редактирует.

Раньше, когда мне нужно было знать, на какую страницу возвращаться, я предоставлял параметр returnURL для моего текущего представления.

родовое слово

Это не очень чистый способ справиться с этой ситуацией, поскольку иногда URL-адрес возврата содержит такие параметры, как строки поиска и т. д., которые необходимо включить в URL-адрес.

родовое слово

Кроме того, это создает проблему, когда пользователь может перейти на другую страницу вперед, прежде чем вернуться на страницу с кодом returnURL, потому что вам необходимо передать код returnURL через все посещенные страницы.

Простого вызова функции Back в браузере тоже недостаточно, потому что вы можете захотеть обновить страницу, например для отображения изменений, которые вы только что сохранили на предыдущей странице.

Итак, мой вопрос: нашел ли кто-нибудь умный способ справиться с подобной ситуацией, особенно в среде MVC?

Примечание . Я использую ASP .NET MVC, поэтому, если возможно, я хотел бы получить ответы по этому поводу, однако любые идеи приветствуются.

Это было полезно?

Решение

Что не так с установкой cookie или использованием переменной сеанса?Единственная причина, по которой вы этого не сделаете, заключается в том, что вы не контролируете страницу, которая вызывает вас, и в этом случае ваши единственные варианты - строки запроса, значения публикации или реферер.

Другие советы

Я подумал, что могу добавить свой ответ на вопрос, чтобы узнать, считают ли другие это хорошей идеей.

Я просто передаю его контроллеру с помощью TempViewData:

родовое слово

, а затем обращаюсь к нему аналогично этому (в моей реальной версии я проверяю, что ключ находится в TempData и что returnURL является реальным URL-адресом):

родовое слово

Если необходимо продолжить работу после изменения первой страницы (например, страница поиска -> страница редактирования -> страница редактирования раздела), я добавляю ее снова

родовое слово

Проверьте это сообщение в моем блоге: Использованиефайлы cookie для управления страницей возврата после входа на asp.net mvc 3

Как и упомянул @Mystere Man, вы можете просто использовать для этого файл cookie или сеанс.Я вернулся к файлам cookie, когда некоторое время назад у меня была похожая ситуация.

Попробуйте зарегистрировать новый маршрут, URL-адрес которого является /{controller}/{action}/{id}/returnurl/{*url}, а затем используйте RedirectToAction в действии, которое принимает url в качестве параметра

Request.UrlReferrer.AbsoluteUri
.

Хотя бы я все равно утверждаю, что вы не должны создавать свою собственную кнопку «Назад».

Используйте перехватчик или аспект:

  1. Перехватывайте каждый запрос каким-либо образом (например, аспектом сгенерированного кода кода) и сохраняйте запрошенный URL в сеансе, каждый раз перезаписывая его.
  2. На уровне представления при необходимости обращайтесь к этому объекту сеанса, в вашем случае для обратной ссылки.

Такой дизайн позволяет вам всегда иметь доступ к самому последнему запросу, если вы хотите его использовать. Вотexample для написания аспекта / перехватчика в .NET.Кроме того, PostSharp - это проект аспекта .NET.

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

На концептуальном уровне "обратная способность" страницы должна определяться страницей, на которой вы сейчас находитесь. Представление может сделать это (в большинстве случаев), если параметры, захваченные в Контроллере, передаются ему через ViewModel.

< sizesПример :

Зайдя в Foo, я собираюсь сгенерировать код для просмотра некоторых вещей, а кнопка "Назад" должна вернуться к Bar.

Контроллер

родовое слово

ViewModels

родовое слово

Просмотр (частичный) Foo

Теперь ваш BarView может интерпретировать на основе своей модели, к чему ему нужно вернуться (с использованием кода // No pun intended... or maybe it was. :)).

В BarView (с использованием синтаксиса MVC2):

родовое слово

Вы также можете использовать Html.ActionLink.

< sizesAlternative :

Вы можете унаследовать свои ViewModels от BaseViewModel, у которого может быть защищенное свойство fooId. Установите это где необходимо.

< sizesПример :

В вашей модели просмотра:

родовое слово

В режиме просмотра:

родовое слово

Может ли это быть лучше обработано частичными действиями, которые отображаются, не покидая страницу, и с помощью JQuery для создания рабочего процесса диалога / мастера?

Затем вам нужно только отреагировать на кнопку «Готово» в диалоговом окне, чтобы обновить исходный вид.

Для части вашего вопроса относительно «Сохранение записи они редактируют», я бы подумал, что шаблон Post-Redirect-Get (PGR) применится к вам.

Это может быть хорошее место для чтения об этом, если вы не знакомы с ним.

  1. Закодируйте returnUrl с помощью кода Url.Encode(returnUrl) для включения в URL.
  2. Когда будете готовы к перенаправлению, используйте код Url.Decode(returnUrl) и используйте значение для фактического перенаправления.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top