Server.transfer изменяет URL во второй раз - PullRequest
5 голосов
/ 12 марта 2010

Я использую 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 предыдущей страницы.

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

1 Ответ

1 голос
/ 09 августа 2012

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

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

Postbacks - это место, где просачивается URL страницы2, если он был предназначен для сокрытия. Чтобы контент страницы2 обрабатывал обратную передачу, он должен выполнить обратную передачу на страницу2. Если бы он отправил обратно на страницу1, страница1 не знала бы, что делать с событиями viewstate и form, поскольку они на самом деле генерируются страницей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-адресам, которые очень просты для понимания пользователем и которые вы можете сопоставить с более сложными параметрами внутри.

...