ASP.NET Web フォーム用の URL 書き換え

公開日: 2008 年 11 月 10 日 (作業者: ruslany (英語))

更新日: 2009 年 5 月 27 日 (作業者: ruslany (英語))

目次
  • フォーム要素用にポストバック URL を設定する
  • AJAX UpdatePanel コントロール用に URL を書き換える
  • Web サーバー コントロールで "~" 演算子を使用する
  • URL の書き換えとサイト ナビゲーション コントロール

フォーム要素用にポストバック URL を設定する

ASP.NET Web フォームではポストバックが多用されるので、ASP.NET ページ用の URL 書き換えを実行する際には、少し工夫が必要です。 ページに Web サーバー コントロールが 1 つ以上含まれている場合、ASP.NET ではページをレンダリングするときに HTML form 要素の action 属性に対して、その form 要素が存在するページを指す (つまりそのページ自体を指す) ように設定します。 このページに対して URL の書き換えを使用すると、action 属性は、ブラウザーから要求された URL ではなく、書き換えられた URL を指します。 そのため、ポストバックが発生するたびに、ブラウザーのアドレス ボックスには書き換えられた URL が表示されます。

action 属性が間違った URL を指さないようにするために、そのページの HtmlForm インスタンスの Action プロパティに、ブラウザーから要求されたポストバック URL を設定できます。 HttpRequest.RawUrl プロパティを使用してこの URL を取得できます。 ASP.NET ページに変更を加えてアクション URL を設定する方法を次の例に示します。

protected void Page_Load(object sender, EventArgs e) 
{ 
    form1.Action = Request.RawUrl; 
}

メモ   HtmlForm.Action プロパティは、.NET Framework バージョン 3.5 SP1 以降で利用できます。

ASP.NET マスター ページを使用している場合は、マスター ページの Page_Load メソッドにコードを追加して、そのマスター ページを使用するすべてのページ用にポストバック アクション URL を設定できます。

AJAX UpdatePanel コントロール用に URL を書き換える

URL 書き換えモジュールを使用して、UpdatePanel コントロールを 1 つ以上含むページの URL を書き換えると、その UpdatePanel コントロールによって実行されるすべてのアクションで、書き換えられた URL が使用されます。 そのため、UpdatePanel コントロール内のコントロールが正しく動作しなくなることがあります。この現象は、要求された URL のディレクトリ階層が URL 書き換えによって変更される場合に顕著です。 たとえば、URL 書き換えモジュールを使用して、/Products/Hardware を /Products.aspx に書き換えると、その UpdatePanel コントロールは、UpdatePanel 内のすべてのアクションに対して /Products/Hardware/Products.aspx という URL を使用することになり、 スクリプト エラーが発生します。

これを防ぐには、前のセクション「フォーム要素用にポストバック URL を設定する」の記述に従って、ページの HtmlForm インスタンスの Action プロパティを設定します。

Web サーバー コントロールで "~" 演算子を使用する

ASP.NET Web サーバー コントロール内で ~ 演算子を使用して、パスを設定する必要がある場合にアプリケーション ディレクトリのルートを参照できます。 ただし、要求された URL のディレクトリ階層が URL の書き換えによって変更される場合、~ 演算子で指定されたリンクが正しく解決されないことがあります。 たとえば、app1 という名前の Web アプリケーションのルートに存在する Default.aspx ページに、次の Image コントロールが含まれていると仮定します。

<asp:Image runat="server" ImageUrl="~/Images/MyImage.gif" />

URL の書き換えによって URL が https://localhost/app1/folder/file から https://localhost/app1/default.aspx に変更されると、~ 演算子で指定されているリンクは、書き換えられた URL パスに対して相対的に解決されるので、/app1 フォルダーに対する相対パスになります。 この結果生成される img 要素の HTML マークアップを次の例に示します。

<img src="Images/MyImage.gif" ... >

ブラウザーは https://localhost/app1/folder/file を要求したので、https://localhost/app1/folder/Images/MyImage.gifからイメージを取得しようとし、 404 (ファイル未検出) エラーが発生します。

IIS 7.0 用 URL 書き換えモジュールには、この動作を修正するための ASP.NET の更新プログラムが含まれています。 この更新プログラムによって、Web サーバー コントロール内の ~ 演算子は、要求された元の URL に対して相対的に解決されるようになります。 前の例の状況においても、応答に含まれる HTML マークアップには、次に示すマークアップのように img 要素の正しい URL パスが含まれるようになります。

<img src="../Images/MyImage.gif" ... >

この ASP.NET の更新プログラムは、.NET Framework 3.5 SP1 以降に適用できます。 この更新プログラムを入手するには、.NET Framework をバージョン 3.5 SP1 にアップグレードしてから、IIS 7.0 用 URL 書き換えモジュールのインストーラーを実行してください。その際に、この ASP.NET 更新プログラムもインストールされます。

URL の書き換えとサイト ナビゲーション コントロール

ASP.NET サイト マップを使用して Web サイトの構造を記述すると、サイト ナビゲーション API およびサイト ナビゲーション コントロールで物理的サイト構造の代わりに論理的サイト構造を表示できます。 サイト ナビゲーションを使用する ASP.NET アプリケーションで URL 書き換えモジュールを使用するのは、通常、公開 URL または仮想 URL を用いた論理的サイト構造に基づいて動作するナビゲーション コントロールが必要な場合です。

たとえば、次の例のようなサイト マップを定義できます。

<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="https://schemas.microsoft.com/AspNet/SiteMap-File-1.0">
  <siteMapNode url="~/Products/" title="Products" description="Products Home Page">   
    <siteMapNode url="~/Products/Hardware/" title="Hardware" description="Hardware Products" /> 
    <siteMapNode url="~/Products/Software/" title="Software" description="Software Products" />
  </siteMapNode>
</siteMap> 

次に、以下の書き換えを実行する書き換え規則を定義できます。

  • /Products/ から /Products.aspx
  • /Products/Hardware から /Products.aspx?category=Hardware
  • /Products/Software から /Products.aspx?category=Software

仮想 URL を使用してサイト マップを定義すると、SystemWeb.SiteMapクラスが正しく動作しなくなることがあります。 ASP.NET ページの SiteMap.CurrentNodeプロパティにアクセスするときに、そのプロパティに Null が含まれていることがあります。 このことが原因で、SiteMapPath、Menu などのサイト ナビゲーション コントロールが正しく動作しなくなることがあります。

IIS 7.0 用の URL 書き換えモジュールには、書き換えられた仮想 URL でこれらのナビゲーション コントロールが正しく動作するように修正する更新プログラムが含まれています。 この更新プログラムによって、SiteMap.CurrentNode プロパティは、現在要求されている仮想 URL に対応する SiteMapNode を参照するようになります。

この ASP.NET の更新プログラムは、.NET Framework 3.5 SP1 以降に適用できます。 この更新プログラムを入手するには、.NET Framework をバージョン 3.5 SP1 にアップグレードしてから、IIS 7.0 URL 書き換えモジュールのインストーラーを実行してください。その際に、この ASP.NET 更新プログラムもインストールされます。

関連コンテンツ

記事