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

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

 resolves to:  

我似乎无法得到谷歌搜索给我我想要的结果所以我想我会问这里。

编辑:语法。

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

我有同样的问题,这是我如何解决它:

原始代码

用户控制:

 ... 

代码背后:

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

输出:

 ... 

更新的代码

用户控制:

 ... 

代码背后:

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

输出:

 ... 

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

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

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

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

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

lnk是HtmlAnchor。

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

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

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

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

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

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

 AppRelativeTemplateSourceDirectory = ""; 

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

 Your Link Text/Image Here 

这应该工作。

 text 

这应该工作。

 text 

我的工作也很好…我有一个用户控件AnchorTag.ascx:

 <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="AnchorTag.ascx.cs" Inherits="JavascriptScroll.AnchorTag" %> Anchor Tag 

我把它包括在:

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

。 。 。

  

。 。

它按预期呈现:

  Anchor Tag 

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

编辑:包括嵌套路径

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

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

控制:

 <%@ Control Language="C#" AutoEventWireup="true" CodeFile="WebUserControl2.ascx.cs" Inherits="WebUserControl2" %> " runat="server" >here 

控制代码 – 背后:

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

那这个呢?

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

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