Как мне сделать "обратную" ссылку? - PullRequest
4 голосов
/ 02 июня 2009

У меня есть страница с подробностями, которая вызывается из разных мест и имеет хороший читаемый URL, например

"www.mypage.com/product/best-product-ever".

Страницы вызова (список продуктов) имеют более сложный URL-адрес, например:

"www.mypage.com/offers/category/electronic/page/1/filter/manufacturer/sony/sort/price" и

"www.mypage.com/bestseller/this-week".

Как сделать обратную ссылку со страницы сведений на список вызывающих продуктов?

  • Я не могу использовать JavaScript
  • Я не хочу, чтобы вызывающая страница была в URL-адресе, потому что она становится длинной
  • Мне очень нужны ссылки между страницами, нет http-поста
  • Я не могу использовать Sessionstate

EDIT: Состояние Sessionstate исключено, поскольку если открыто 2 Windows, они будут использовать одну и ту же информацию «Back» на странице.

Ответы [ 5 ]

4 голосов
/ 02 июня 2009

Как сказал Ли, используйте значение реферера:

<a href="<%= Html.Encode(Request.UrlReferrer.ToString()) %>">Back</a>

Если вы не хотите, чтобы URL-адрес в ссылке был слишком длинным, попробуйте запустить какой-либо простой алгоритм сжатия поверх URL-адреса, отобразить сжатые данные в виде текста в Unicode и затем добавить сжатый URL-адрес в качестве параметра для перенаправления страница, например:

<a href="Redirect.aspx?u=compressed_url_goes_here">Back</a>
2 голосов
/ 02 июня 2009

Как насчет использования значения заголовка реферера?

1 голос
/ 02 июня 2009

Вот сумасшедшая идея, которая потребует честной, но трудолюбивой работы и может не сказаться на производительности (в зависимости от ваших пользователей) .. но здесь мы идем:

Создайте репозиторий для кеширования 'ListResults' (и подключите его для сохранения в БД, которую вы любите ... или просто оставьте в памяти на сервере). Короче говоря, то, что может сделать этот репо, - это сохранить ListResult, который будет включать в себя все, чтобы сохранить состояние текущего представления списка, который просматривает любой данный пользователь. Это может включать маршруты и другие значения ... но, по сути, все, что необходимо для перенаправления обратно на эту конкретную страницу отфильтрованного и отсортированного списка.

Когда элемент ListResult добавляется в репо, генерируется небольшой уникальный хеш / ключ, который будет удобен для URL - что-то вроде этого "k29shjk4" - он добавляется к элементу вместе с отметкой даты и времени.

ListResult сохраняются только с того момента, как список выходит из представления по умолчанию (т. Е. Без фильтрации, сортировки и страницы) - это немного снизит производительность.

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

Для навигации «назад» к списку вам может понадобиться новый маленький контроллер, который просто принимает значение хеша ListResult.Key и перенаправляет / заново создает состояние представления списка (включая подкачку, фильтрацию и сортировку) из поиск в репо.

Итак, мы уже выполнили требования: в URL не было ни одной вызывающей страницы (в том смысле, что это не вся страница - просто ее хеш-поиск); нет сообщений, нет сеансов, нет JS.

Чтобы остановить репо ListResult на большом (и опасном: если вы сохраните его в БД), вы можете использовать фоновую службу ASP.NET для периодического сокращения «старых» маршрутов с помощью отметки времени .. и «продлить» срок действия постоянно используемых маршрутов, добавив время к отметке элемента ListResult при запросе через новый контроллер. Не нужно сохранять маршрут бесконечно, потому что, если пользователю нужна постоянная ссылка на представление списка, он может добавить в закладки длинный маршрут самого списка.

надеюсь, это как-то поможет

0 голосов
/ 02 июня 2009

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

Я не знаю, относится ли это к вашему условию "нет публикации", но я вижу только один вариант: действие Detail должно быть только POST ([AcceptVerbs(HttpVerbs.Post)]) и включать другой параметр, например string fullRoute который преобразуется в «ссылку» на странице сведений для «Назад к результатам». Перегрузите действие Detail, пропустив параметр fullRoute, и перегрузите действие как действие GET, так что значение POST fullRoute не требуется (для случаев, когда пользователи в порядке со ссылкой «универсальный» «Назад»). Это должно обслуживать как «общие» запросы GET на странице сведений, так и запрос POST, который будет включать в себя специальную ссылку «Вернуться к результатам» для отфильтрованного списка.

0 голосов
/ 02 июня 2009

У вас есть печенье?

Если это так, вы можете поместить его туда или использовать его для создания собственного состояния сеанса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...