Умный способ обработки URL-адресов возврата в среде MVC
-
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
.
Хотя бы я все равно утверждаю, что вы не должны создавать свою собственную кнопку «Назад».
Используйте перехватчик или аспект:
- Перехватывайте каждый запрос каким-либо образом (например, аспектом сгенерированного кода кода) и сохраняйте запрошенный URL в сеансе, каждый раз перезаписывая его.
- На уровне представления при необходимости обращайтесь к этому объекту сеанса, в вашем случае для обратной ссылки.
Такой дизайн позволяет вам всегда иметь доступ к самому последнему запросу, если вы хотите его использовать. Вот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) применится к вам.
Это может быть хорошее место для чтения об этом, если вы не знакомы с ним.
- Закодируйте returnUrl с помощью кода
Url.Encode(returnUrl)
для включения в URL. - Когда будете готовы к перенаправлению, используйте код
Url.Decode(returnUrl)
и используйте значение для фактического перенаправления.