如何让服务器控件HTMLAnchor拥有href =“#”。它不断解析控制路径的“#”。
<a href="#" runat="server" />
resolves to: <a href="../ControlPath/#">
我似乎无法通过谷歌搜索向我提供我想要的结果,所以我想我会问这里。
编辑:语法。
不能删除runat服务器。它在后端被操纵,这只是一种简化。
答案 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";
适合我,但我在类库中使用服务器控件而不是用户控件。我认为它也适用于用户控件。