asp.net用户控件,让htmlAnchor解析为href =“#”

时间:2009-09-28 20:57:14

标签: c# asp.net user-controls

如何让服务器控件HTMLAnchor拥有href =“#”。它不断解析控制路径的“#”。

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

我似乎无法通过谷歌搜索向我提供我想要的结果,所以我想我会问这里。

编辑:语法。

不能删除runat服务器。它在后端被操纵,这只是一种简化。

10 个答案:

答案 0 :(得分:27)

我遇到了同样的问题,这是我可以解决的问题:

原始代码

用户控制:

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

答案 1 :(得分:9)

在使用PageParser.GetCompiledPageInstance()呈现页面或重写url时,我遇到了类似的问题。由于某些原因,HtmlAnchor总是错误地解决(类似于你上面的内容)。

只使用HtmlGenericControl结束,因为无论如何你都在操作服务器端,这可能对你有用。

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

答案 2 :(得分:2)

Brendan Kowitz解决方案可行,但由于此控制的运行方式,我无法实施。我最终不得不按照后面代码中的以下代码来破解它:

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

lnk是HtmlAnchor。

首先出现此问题的原因是控件与页面不在同一目录中,而.Net则“智能地”为您解决问题。上述方法可行,但如果有人有更好的解决方案,我会全力以赴。

答案 3 :(得分:2)

最初我将此作为评论,但是根据要求我将其添加为答案,因为没有其他人解释为什么原始行为正在发生或如何直接阻止它。

URL重写是由Control类上的ResolveURL方法引起的。我在Reflector中查看它,发现如果AppRelativeTemplateSourceDirectory非空,它会尝试重写它认为是相对URL的任何内容。

简单的解决方法是在Page对象上将此变量设置为某个全局级别的空字符串(或者至少在Render之前),尽管如果控制结构的某些其他部分要求为空,这可能是一个问题

我认为真正的解决办法是让微软让UrlPath.IsRelativeUrl()变得更聪明。

答案 4 :(得分:1)

我遇到了同样的事情。如果你在页面加载时设置它,它将起作用:

AppRelativeTemplateSourceDirectory = "";

答案 5 :(得分:0)

尝试删除“runat”属性并包装要链接的内容;

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

答案 6 :(得分:0)

这应该可以。

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

<击>

这应该有用。

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

答案 7 :(得分:0)

编辑:包含嵌套路径

我的测试项目为我呈现了正确的链接:

 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);
}

答案 8 :(得分:0)

Mine也工作得很好......我有一个用户控件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>

如果我正在做一些不期望的事情,请纠正我......

答案 9 :(得分:0)

这个怎么样?

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

适合我,但我在类库中使用服务器控件而不是用户控件。我认为它也适用于用户控件。