ASP.NET Web Formsでのページ遷移

よく目にするテーマですけど、改めておさらいと言うことで。

今回はあくまでページ遷移の方法を載せるだけで、ページ間の値の保持については言及しません。

なぜよくテーマになるのか

ASP.NET Web Formsは基本、1ページ内で処理が完結するフレームワークです。
(いわゆるポストバックってやつです。)

そのため普通にWeb Formsを使って開発をしていると他ページへの遷移方法でつまづくことがあるかもしれません。

ページ遷移の方法

早速ですがページ遷移の方法を紹介します。

今回は以下の4つの方法についてです。

① HyperLinkコントロールのNavigateUrl

② Response.Redirect

③ Server.Transfer

④ IButtonコントロールのPostBackUrl

その1 HyperLinkコントロールのNavigateUrl

一つ目はHyperLinkコントロールのNavigateUrlです。

HyperLinkコントロールはHTMLとして出力されたときに<a>タグとして吐き出されます。

NaviagteUrlで指定した遷移先は<a>タグ内のhref要素として出力されます。

<asp:HyperLink NavigateUrl="~/Account/Login.aspx" runat="server" Text="ログインに遷移" />

上記のように記述した場合、下記のようにHTMLとして出力されます。

<a href="Account/Login.aspx">ログインに遷移</a>

NavigateUrlは同一プロジェクト、サイト内への遷移であれば相対パスで指定できます。

外部サイトへのリンクとして利用する場合はそのURLをそのまま記述すればOKです。

また、動的に遷移先を変えたい場合はコードビハインド側でNavigateUrlを指定します。

Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    ' フラグが渡ってきたらTOPページに遷移する
    Me.HypTransfer.NavigateUrl = If(Me.Request.QueryString("flg") = "1", "Index.aspx", "~Account/Login.aspx")
End Sub

その2 Response.Redirect

二つ目はResponse.Redirectを使用した遷移です。

Private Sub BtnRedirect_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BtnRedirect.Click
    Response.Redirect("~/Account/Login.aspx")
End Sub

上記のコードはボタンが押下されたときに別ページへ遷移する場合の例です。

ポストバックでResponse.Redirectでページ遷移する場合、2回サーバーにアクセスすることになります。

まずポストバックのリクエストで1回、次に遷移先のページへのリクエストで2回です。

サーバーアクセスを減らしたいのであれば別の方法でページ遷移を実装すべきかもしれません。

また、Response.Redirectの第2引数のendRequestで、以降の処理を中断するかどうかを指定することができます。

endRequestをTrueにすると後続処理は行われませんし、Falseにすれば後続処理は実施されます。

endRequestを指定しない場合はTrueにしたときと同じ挙動になります。

Private Sub BtnRedirect_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BtnRedirect.Click
    Response.Redirect("~/Account/Login.aspx")
    Session("Key") = "session" ' ここの処理は行われない
End Sub
Private Sub BtnRedirect_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BtnRedirect.Click
    Response.Redirect("~/Account/Login.aspx", True)
    Session("Key") = "session" ' ここの処理は行われない
End Sub
Private Sub BtnRedirect_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BtnRedirect.Click
    Response.Redirect("~/Account/Login.aspx", False)
    Session("Key") = "session" ' ここの処理は行われる
End Sub

また、Response.RedirectはHyperLinkのNavigateUrlと同様に外部サイトへ遷移することも可能です。

その3 Server.Transfer

三つ目はServer.Transferでの遷移です。

Private Sub BtnTransfer_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BtnTransfer.Click
    Server.Transfer("~/Account/Login.aspx")
End Sub

上記のコードもResponse.Redirectと同様、ボタンが押下されたときに別ページへ遷移する場合の例です。

ただResponse.Redirectがページ遷移するためにサーバーに2回アクセスしますが、Server.Transferは1回のアクセスで済みます。

というのもResponse.Redirectが遷移前のページにポストバックした後に再度新しいページへのリクエストが送信されるのに対し、
Server.Transferは遷移前のページにポストバックしている時にサーバー内で別ページへ遷移するためです。

そのため遷移後のURLは遷移前のページのURLとなります。

もう一つの違いは上記の通りServer.Transferはサーバー内でページ遷移するため、外部サイトへの遷移ができません。

またResponse.Redirectと違って遷移前のページのリクエスト情報を引き継ぐことができますが、ここでは詳細は割愛します。

その4 IButtonコントロールのPostBackUrl

IButtonコントロールと聞いてもピンとこないかもしれませんが、Button、ImageButton、LinkButtonコントロールのことです。

これらのコントロールはsubmitボタンとしてHTMLに出力されます。

通常ASP.NET Web FormsでIButtonコントロールを押下すると自身のページにポストバックしますが、PostBackUrlを指定すればポストバックするページを変更することができます。

<asp:Button ID="BtnPostBackUrl" runat="server" Text="他ページへポストバック" PostBackUrl="~/Account/Login.aspx" />

PostBackUrlでポストバック先を指定した場合、遷移元でのポストバックは発生せずに遷移先のページへ遷移します。

外部サイトへPOSTして遷移することも可能ですが、使用することはまずないと思います。

まとめ

以上ASP.NET Web Formsでページ遷移する方法を4つ紹介しました。

色々とクセのあるフレームワークで上記の4つでも思わぬ不具合が発生することがあると思います。

最初に述べた通り、1ページ内で処理が完結することを目的として作られたフレームワークなので、ページ遷移を頻繁に行うアプリであればASP.NET MVCなど別のフレームワークを使用すべきでしょう。

それでもWeb Formsを使いたいのであれば上記4つの方法から試行錯誤してベストプラクティスを発見する必要があります。

カテゴリー: .NET, ASP.NET, VB, Web Forms パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>