web-dev-qa-db-ja.com

asp.Netユーザーコントロール、htmlAnchorをhref = "#"に解決する

サーバーコントロールHTMLAnchorにhref = "#"を設定するにはどうすればよいですか。制御パスへの「#」を解決し続けます。

<a href="#" runat="server" />
resolves to: <a href="../ControlPath/#">

グーグル検索で欲しい結果が出ないようですので、ここで聞いてみようと思いました。

編集:構文。

Runatサーバーを削除することはできません。これはバックエンドで操作されます。これは単なる単純化です。

24
Highstead

私は同じ問題を抱えていました、これが私がそれを解決する方法です:

元のコード

ユーザーコントロール:

<a id="foo" runat="server">...</a>

背後にあるコード:

foo.Attributes.Add("href", "#");

出力:

<a id="..." href="../Shared/Controls/#">...</a>

更新されたコード

ユーザーコントロール:

<asp:HyperLink id="foo" runat="server">...</asp:HyperLink>

背後にあるコード:

foo.Attributes.Add("href", "#");

出力:

<a id="..." href="#">...</a>
29
Ramses

PageParser.GetCompiledPageInstance()を使用してページをレンダリングするとき、またはURLが書き換えられるときに、同様の問題が発生しました。何らかの理由で、HtmlAnchorは常に正しく解決されませんでした(上記と同様)。

とにかくサーバー側で操作しているので、HtmlGenericControlを使用するだけで終わりました。これは可能性があるかもしれません。

HtmlGenericControl anchor = new HtmlGenericControl("a");
anchor.Attributes.Add("href", "#");
9
Brendan Kowitz

Brendan Kowitzソリューションは機能しますが、このコントロールの動作方法が原因で実装できませんでした。コードビハインドの次のコードに従って、ハッキングする必要がありました。

lnk.Attributes.Add("href",Page.Request.Url.ToString() + "#");

ここで、lnkはHtmlAnchorです。

そもそもこの問題の理由は、コントロールがページと同じディレクトリにないためです。Netは、問題を「インテリジェントに」修正します。上記はうまくいきますが、誰かがより良い解決策を持っているなら、私はすべての耳です。

2
Highstead

もともとコメントとして持っていたのですが、なぜ元の動作が発生しているのか、直接防ぐ方法を誰も説明していないので、リクエストにより回答として追加しています。

URLの書き換えは、ControlクラスのメソッドResolveURLによって引き起こされます。 Reflectorで調べたところ、AppRelativeTemplateSourceDirectoryが空でない場合、相対URLと思われるものをすべて書き換えようとしていることがわかりました。

簡単な回避策は、Pageオブジェクトのこの変数をグローバルレベルで(または少なくともRenderの前に)空の文字列に設定することですが、これは、制御構造の他のビットで空にする必要がある場合に問題になる可能性があります。

本当の解決策は、MicrosoftにUrlPath.IsRelativeUrl()をよりスマートにすることだと思います。

2
sorpigal

私は同じことに遭遇しました。これをページの読み込み時に設定すると、次のように機能します。

AppRelativeTemplateSourceDirectory = "";
1
Gx3r0

編集:ネストされたパスを含む

私のテストプロジェクトは私のために正しいリンクをレンダリングします:

 http://localhost:2279/WebSite1/Default.aspx#

ASPX:

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Register src="control/WebUserControl2.ascx" tagname="WebUserControl2" tagprefix="uc1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">    
          <uc1:WebUserControl2 ID="WebUserControl21" runat="server" />
    </form>
</body>
</html>

コントロール:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="WebUserControl2.ascx.cs" Inherits="WebUserControl2" %>
<a id="A1" href="<%# URLHelper("~/#") %>" runat="server" >here</a>

制御コード-背後:

protected string URLHelper(string s)
{
    return Control.ResolveUrl(s);
}
0
rick schott

私も問題なく動作します...私はユーザーコントロールAnchorTag.ascxを持っています:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="AnchorTag.ascx.cs" Inherits="JavascriptScroll.AnchorTag" %>
<a id="A1" href="#" runat="server" >Anchor Tag</a>

そして私はそれを次のように含めました:

<%@ Register src="AnchorTag.ascx" tagname="AnchorTag" tagprefix="uc1" %>

。 。 。

<uc1:AnchorTag ID="AnchorTag1" runat="server" />

。 。

そしてそれは期待通りにレンダリングします:

 <a href="#" id="AnchorTag1_A1">Anchor Tag</a>

予期しないことをしている場合は訂正してください...

0
Manish

「runat」属性を削除して、リンクしたいものをラップしてみてください。

<a href="#" >Your Link Text/Image Here</a>
0
CmdrTallen

これはどうですか?

HtmlAnchor errorLink = new HtmlAnchor();
errorLink.InnerText = this.Message;
errorLink.HRef = errorLink.ResolveClientUrl("#" + this.FormControlId);
errorLink.Attributes["rel"] = "form_help";

私にとっては機能しますが、ユーザーコントロールではなく、クラスライブラリでサーバーコントロールを使用しています。ユーザーコントロールでも機能するはずだと思います。

0
James

これはうまくいくはずです。

<a href="javascript:void(0)">text</a>

これはうまくいくはずです。

<a href="~/#">text</a>
0
ChaosPandion