Это ожидаемое поведение.
Когда вы используете 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-адресам, которые очень просты для понимания пользователем и которые вы можете сопоставить с более сложными параметрами внутри.