たとえば、ページ内の名前付きアンカーにリンクする単純なハイパーリンクをレンダリングしようとしています。
<a href="#namedAnchor">scroll to down</a>
<a name="namedAnchor">down</a>
問題は、asp:HyperLink
やHtmlAnchor
などのASP.NETコントロールを使用すると、href="#namedAnchor"
がhref="controls/#namedAnchor"
(controls
はアンカーを含むユーザーコントロールがあるサブディレクトリ)。 2つのタイプのアンカーコントロールを使用するコントロールのコードを次に示します。どちらも同じ問題があります。
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Test.ascx.cs" Inherits="TestWebApplication1.controls.Test" %>
<a href="#namedAnchor" runat="server">HtmlAnchor</a>
<asp:HyperLink NavigateUrl="#namedAnchor" runat="server">HyperLink</asp:HyperLink>
生成されたソースは次のようになります。
<a href="controls/#namedAnchor">HtmlAnchor</a>
<a href="controls/#namedAnchor">HyperLink</a>
私は本当に欲しい:
<a href="#namedAnchor">HtmlAnchor</a>
<a href="#namedAnchor">HyperLink</a>
私はHtmlAnchor
またはHyperLink
クラスを使用しています。コードビハインドの他の属性を変更したいからです。私が追求している要件は、従来のASP.NETリンクコントロールを放棄することを正当化するほど重要ではないため、この要件にカスタムWebコントロールを導入したくありません。 ASP.NETリンクコントロールを使用して目的のリンクを生成できるように思えます。
NavigateUrlプロパティを使用する代わりに、hrefプロパティを使用する
<asp:HyperLink href="#namedAnchor" runat="server">HyperLink</asp:HyperLink>
分離コードでHREFプロパティを設定するには:
HyperLink link = new HyperLink();
link.Attributes.Add("href", "#" + doc.DocumentID.ToString());
link.Text = doc.DocumentNumber;
これはあなたに与えるでしょう:
<a href="#111">blah blah</a>
リンクのカスタムプロパティとして設定します。
HyperLink link = new HyperLink();
link.Attributes.Add("name", doc.DocumentID.ToString());
link.Text = doc.DocumentNumber;
これはあなたに与えるでしょう:
<a name="111">blah blah</a>
NavigateUrlプロパティを使用する必要がある場合は、これが必要になる場合があります。使用できるのは次のとおりです。
hypID.NavigateUrl = HttpContext.Current.Request.Url.AbsoluteUri & "#MyAnchor"