これは予期される動作です。
Server.Transfer
ASP.NETを使用するThreadAbortException
と、元の要求の処理が停止し、すぐに同じスレッドで新しい要求の処理が開始されます。新しいリクエストが実行され、その出力がブラウザに送信されます。ブラウザは について何も知りませんServer.Transfer
。ブラウザが知っているのは、ページ 1 を要求し、サーバーが何らかのコンテンツをブラウザに送り返したことだけです。これは開発者としては実際にはページ 2 からのものです。
ポストバックは、非表示にすることを意図した場合、ページ 2 の URL が漏れる場所です。page2 コンテンツがポストバックを処理するには、page2 にポストバックする必要があります。それが page1 にポストバックされた場合、これらは実際には page2 によって生成されるため、page1 は viewstate および form イベントをどう処理するかわかりません。これを実現するために、<form>
page2 によって提供される要素にはaction
of がありpage2
ます。の後にブラウザで html ソースを見ると、次のように表示されServer.Transfer
ます。
<form name="aspnetForm" method="post" action="Page2.aspx" id="aspnetForm">
従来の Web フォームを使用してユーザーから URL を完全に隠す唯一の実際の方法は、ポストバックを使用せず、ページ 2 のすべてのリンクを実際にページ 1 にリンクし、すべてのロジックをページ 1 に追加して適切に処理することです。
または、ポストバックをまったく使用できませんでした。ajax を介してすべてのアクションを実行した場合、ブラウザの URL はまったく変更されず、とにかくユーザーにとってより良いエクスペリエンスを得ることができるはずです。
さらに良いのは、ASP.NET MVC を使用することです。これにより、ユーザーが非常に理解しやすく、内部でより複雑なパラメーターにマップできるフレンドリーな REST のような URL にプッシュされます。