トップ回答者
HyperLinkで相対パス

質問
-
初歩的な質問で申し訳ございませんが、どうしてもわからず・・・。
ルーティングを利用し、相対リンクでアクセスするWebサイトを構築しようとしております。
実際は
http:// ドメイン(固定) / Default.aspx
にあるページを、
http:// ドメイン(固定) / ユーザ名(各ユーザ毎に生成) / Default.aspx
として動かしています。
HyperLink コントロールのNavigateUrl属性に「a.aspx」のような形でリンク先を入力するのですが、HTMLとして出力された時には強制的に「../a.aspx」と置き換えられてしまいます。
ユーザ名の部分をNavigateUrl属性に強制的に書き加えれば問題ないので、Page_Load時に全リンクを書き換える処理を加えればできなくはないのですが、いくらなんでも非効率です。
設定を行う部分などがありましたら教えて頂きたいです。
よろしくお願い致します。
回答
すべての返信
-
小野様、返信ありがとうございます。
ちなみにBlogの方も度々参考にさせて頂いております。。。ルーティング処理の方も、Blogの方を参考にさせて頂きながら作成しました。
C#の方は存じないので、VBで書き換えております。
とは言え、ほぼコピペで申し訳ございませんが・・・。以下のクラスを作成して、
Public Class CustomRouteHandler
Implements IRouteHandlerPublic VirtualPath As String
Public Sub New(ByVal path As String)
VirtualPath = path
End Sub
Public Function GetHttpHandler(ByVal requestContext As System.Web.Routing.RequestContext) As IHttpHandler _
Implements System.Web.Routing.IRouteHandler.GetHttpHandlerDim vPath As String = VirtualPath
Dim key As String() = vPath.Split("/")
For i As Integer = 0 To key.Count - 1
If key(i).ToString.IndexOf("{") >= 0 AndAlso key(i).ToString.IndexOf("}") >= 0 Then
Dim keystr As String = key(i).Remove(key(i).IndexOf("}")).Substring(key(i).IndexOf("{") + 1)
vPath = vPath.Replace("{" & keystr & "}", requestContext.RouteData.GetRequiredString(keystr))
End If
Next
Dim redirectPage As IHttpHandler
redirectPage = System.Web.Compilation.BuildManager.CreateInstanceFromVirtualPath(vPath, GetType(Page))
Return redirectPage
End Function
End Class
後は、Global.asax の Application_Start で、
RouteTable.Routes.Add(New Route("{user}/{page}.aspx", New CustomRouteHandler("/{page}.aspx")))
のようにしております。
後は、web.config に
<httpModules>
<add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</httpModules>
を追加しました。以上です。抜け等があったら申し訳ございませんが、これで何かわかりましたらご指摘をお願いします。
こちらでも引き続き調査してみます。よろしくお願い致します。
-
小野様、返信ありがとうございます。
やはりドコの環境でも同様ですか・・・了解しました。
HyperLinkでないといけない理由は特にありません。
まだVisualStudio自体を使い慣れないので、コントロールを多用してページ作成を行っていただけでして・・・。
勿論ですが、aタグで行った所 href の強制書き換えは行われませんでした。
これも勿論かも知れませんが、、、aタグでも 「runat="server"」を入れると強制書き換えが行われたりします。
サーバサイドのどの部分でこの書き換えが行われているか・・・気にはなりますが、拘る必要はありませんね。
サイト構築はこのまま aタグで行おうと思います。
ご迷惑お掛けしました。。。 -
どっとねっとふぁん さんからの引用 equestContext.RewritePath を呼び出しちゃうと、ルーティングを使っている意味がなくなりますね。
私が .NET 2.0 ばかりなので、3.5 の System.Web.Routnig 関連をよくわかっていないのですが、そういうものなのですね。
どっとねっとふぁん さんからの引用 その場合、ポストバック先をうまくコントロールする必要がでてきます。
これで幸せにしてます http://d.hatena.ne.jp/ladybug/20070314他にも自身のサイトを見てみると、 " ~/{username}/{page}.aspx" を "~/__template__/{page}.aspx" へと転送していました。このように、転送元と転送先の相対パスの階層レベルを同じにしておくことで、レンダリングされるHREFが調整できているようです。