Это ожидаемое поведение.
При использовании 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