none
HyperLinkで相対パス RRS feed

  • 質問

  • 初歩的な質問で申し訳ございませんが、どうしてもわからず・・・。

    ルーティングを利用し、相対リンクでアクセスするWebサイトを構築しようとしております。

     

    実際は

     

    http:// ドメイン(固定) / Default.aspx

     

    にあるページを、

     

    http:// ドメイン(固定) / ユーザ名(各ユーザ毎に生成) / Default.aspx

     

    として動かしています。

     

    HyperLink コントロールのNavigateUrl属性に「a.aspx」のような形でリンク先を入力するのですが、HTMLとして出力された時には強制的に「../a.aspx」と置き換えられてしまいます。

     

    ユーザ名の部分をNavigateUrl属性に強制的に書き加えれば問題ないので、Page_Load時に全リンクを書き換える処理を加えればできなくはないのですが、いくらなんでも非効率です。

     

    設定を行う部分などがありましたら教えて頂きたいです。

     

    よろしくお願い致します。

    2009年1月5日 8:17

回答

  • うーん、たしかにルーティング使ってるとHyperLinkで相対パスを指定したときに書き換えが発生しますね。

    どうも、現在指定されているURLとHyperLinkで指定した先のファイルが実際にある場所との差を補完しているように見えます。

     

    ちなみに、HyperLinkを使っているのはなぜでしょう。
    通常のリンク(aタグ)を使うわけにはいきませんか?

     

    2009年1月6日 2:23

すべての返信

  • 普通のサイトだとそんな動きにならないですね。
    ルーティングが問題なのかなぁ。。。

    どんなふうにルーティングの設定をしているか、とかを教えてもらえますか?

    2009年1月5日 9:27
  • 小野様、返信ありがとうございます。
    ちなみにBlogの方も度々参考にさせて頂いております。。。

     

    ルーティング処理の方も、Blogの方を参考にさせて頂きながら作成しました。
    C#の方は存じないので、VBで書き換えております。
    とは言え、ほぼコピペで申し訳ございませんが・・・。

     

    以下のクラスを作成して、


    Public Class CustomRouteHandler
        Implements IRouteHandler

        Public 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.GetHttpHandler

            Dim 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>


    を追加しました。

     

    以上です。抜け等があったら申し訳ございませんが、これで何かわかりましたらご指摘をお願いします。
    こちらでも引き続き調査してみます。

    よろしくお願い致します。

     

    2009年1月5日 11:01
  • うーん、たしかにルーティング使ってるとHyperLinkで相対パスを指定したときに書き換えが発生しますね。

    どうも、現在指定されているURLとHyperLinkで指定した先のファイルが実際にある場所との差を補完しているように見えます。

     

    ちなみに、HyperLinkを使っているのはなぜでしょう。
    通常のリンク(aタグ)を使うわけにはいきませんか?

     

    2009年1月6日 2:23
  • 小野様、返信ありがとうございます。
    やはりドコの環境でも同様ですか・・・了解しました。

    HyperLinkでないといけない理由は特にありません。
    まだVisualStudio自体を使い慣れないので、コントロールを多用してページ作成を行っていただけでして・・・。

    勿論ですが、aタグで行った所 href の強制書き換えは行われませんでした。
    これも勿論かも知れませんが、、、aタグでも 「runat="server"」を入れると強制書き換えが行われたりします。

    サーバサイドのどの部分でこの書き換えが行われているか・・・気にはなりますが、拘る必要はありませんね。

    サイト構築はこのまま aタグで行おうと思います。
    ご迷惑お掛けしました。。。
    2009年1月6日 2:40
  • GetHttpHandler の中で、requestContext.RewritePath を呼び出さないと、
    現在のコンテキストURLが ~/{user}/default.aspx でリンク先のURLが ~/a.aspx なら、
    サーバタグのHTML は ../a.aspx と生成されるのが当然ですよね?
    2009年1月6日 3:38
  • > サーバタグのHTML は ../a.aspx と生成されるのが当然ですよね?

     

    そういうことなんでしょうね。
    いままであまりそこを意識したことなかった(w

     

    requestContext.RewritePath を呼び出しちゃうと、ルーティングを使っている意味がなくなりますね。
    その場合、ポストバック先をうまくコントロールする必要がでてきます。

     

     

    2009年1月6日 3:57
  •  どっとねっとふぁん さんからの引用

    equestContext.RewritePath を呼び出しちゃうと、ルーティングを使っている意味がなくなりますね。



    私が .NET 2.0 ばかりなので、3.5 の System.Web.Routnig 関連をよくわかっていないのですが、そういうものなのですね。


     どっとねっとふぁん さんからの引用

    その場合、ポストバック先をうまくコントロールする必要がでてきます。



    これで幸せにしてます http://d.hatena.ne.jp/ladybug/20070314 
     
    他にも自身のサイトを見てみると、 " ~/{username}/{page}.aspx" を "~/__template__/{page}.aspx" へと
    転送していました。このように、転送元と転送先の相対パスの階層レベルを同じにしておくことで、レンダリングされるHREFが調整できているようです。
    2009年1月9日 3:35