Server.transfer меняет URL во второй раз

Я использую Asp.net 2.0. Я делаю server.transfer со страницы 1 на страницу 2. URL-адрес остается страницей 1. Теперь я нажимаю ссылку на странице 2, и это переносит меня на страницу 3. Таким образом, URL-адрес должен оставаться на странице 1. Вместо этого браузер теперь показывает URL-адрес страницы стр. 2. Это ожидаемое поведение?

На самом деле я пытался скрыть параметры из URL.

  1. Я не могу использовать response.redirect, потому что отсюда нельзя перейти на предыдущую страницу.
  2. Я пытался использовать PostBackUrl, но это не сработает для меня, потому что мне нужно сохранить данные на текущей странице, а затем показать следующую страницу, если ошибок не возникло. Если данные были неверны, и/или были ошибки, то мне нужно показать пользователю ту же страницу.
  3. Теперь я подумал попробовать server.transfer, но он показывает URL-адрес предыдущей страницы.

Может ли кто-нибудь указать мне в правильном направлении?


person Yogesh Jindal    schedule 12.03.2010    source источник
comment
Я закончил тем, что использовал сеансы, и это решило проблему для меня. Но я все же хотел бы знать, каково решение этой проблемы.   -  person Yogesh Jindal    schedule 13.03.2010


Ответы (1)


Это ожидаемое поведение.

При использовании Server.Transfer ASP.NET прекращает обработку исходного запроса через ThreadAbortException, а затем сразу же в том же потоке начинает обработку нового запроса. Новый запрос запускается и отправляет свой вывод в браузер. Браузер ничего не знает о Server.Transfer. Все, что знает браузер, это то, что он запросил страницу 1, и сервер отправил ему некоторый контент, который, как вы знаете, как разработчик, на самом деле находится на странице 2.

Постбэки — это место, где просачивается URL-адрес страницы 2, если он должен был быть скрыт. Чтобы контент page2 мог обрабатывать обратную передачу, он должен выполнять обратную передачу на страницу page2. Если бы он отправил обратно на страницу 1, страница 1 не знала бы, что делать с событиями состояния представления и формы, поскольку они фактически генерируются страницей 2. Для этого элемент <form>, обслуживаемый page2, имеет action из page2. Посмотрите на свой исходный html в браузере после Server.Transfer, вы увидите это:

<form name="aspnetForm" method="post" action="Page2.aspx" id="aspnetForm">

Используя традиционные веб-формы, единственным реальным способом полностью скрыть URL-адрес от пользователя было бы не использовать обратные передачи и сделать так, чтобы все ссылки на странице 2 фактически ссылались на страницу 1, и добавить всю логику на страницу 1 для соответствующей обработки.

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

Еще лучше было бы использовать ASP.NET MVC, который подталкивает вас к дружественным REST-подобным URL-адресам, которые очень просты для понимания пользователем и которые вы можете внутренне сопоставлять с более сложными параметрами.

person Samuel Neff    schedule 09.08.2012