C#と諸々

C#がメインで他もまぁ諸々なブログです
おかしなこと書いてたら指摘してくれると嬉しいです(´・∀・`)
つーかコメント欲しい(´・ω・`)

2007/10/04 00:02
今まで知らなかったんですが、ASP.NET では仮想パスの先頭に "~" ( ティルダ ) を付けると、ASP.NET アプリケーションのルートディレクトリを基準とした絶対パス ( 相対パスの方が正しい? ) が記述できるようです。
例えば "http://hoge:8000/fuga/" に配置された ASP.NET アプリケーション内では、"~/Piyo.aspx" は "/fuga/Piyo.aspx" に変換されます。
以下のコードは、現在のディレクトリ階層に関わらずルートディレクトリの Piyo.aspx へリダイレクトします。

HttpContext.Current.Response.Redirect("~/Piyo.aspx");

ただし、この "~" は、 ASP.NET が解釈して変換しているだけであり、ブラウザが解釈できるわけではありません。ブラウザに "~" から始まるパスが渡されたところでブラウザは単に現在のアドレスを基準とした相対パスとして解釈してしまいます。
だから、ASP.NET がパスを変換してくれないものに対して "~" は使えません。

例えば、ASPX ファイルに記述された [ a ] タグは、基本的にそのままクライアントに送られますので、

<a href="~/Foo.aspx">Foo</a>
なんて書いても、ブラウザにはこのリンクが "http://hoge:8000/fuga/~/Foo.aspx" と解釈されてしまいます。こういう場合は大人しく相対パスで記述しましょう。


余談ですが、ASP.NET アプリケーションのルートディレクトリは  HttpRuntime.AppDomainAppVirtualPath プロパティ (System.Web) で取得することができます。最初の例で言えば、このプロパティから "/fuga" という値が取得できます。



※ 注意 ※
モバイルページでセッションステートを Cookie なしで使用する場合は問題が発生する可能性があるそうです。詳しくは [ 参考 ] のリンク先ページを読んでください。


[ 参考 ]
VirtualPathUtility クラス (System.Web)

ASP.NET Web サイトのパス


[ 追記 ]
// 2009/06/29
仮想パスから絶対パスへの変換には VirtualPathUtility.ToAbsolute メソッド (String) (System.Web) が利用できます。
仮想パスから相対パスへの変換には Control.ResolveClientUrl メソッド (System.Web.UI) が利用できます。
タグ: .NET ASP.NET C#











トラックバックURL↓
http://csharper.blog57.fc2.com/tb.php/166-653aeac4