Try removing the "runat" attribute and wrapping what you want to link;
<a href="#" >Your Link Text/Image Here</a>
Mine too works fine...I have a user control AnchorTag.ascx:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="AnchorTag.ascx.cs" Inherits="JavascriptScroll.AnchorTag" %>
<a id="A1" href="#" runat="server" >Anchor Tag</a>
And I included it as :
<%@ Register src="AnchorTag.ascx" tagname="AnchorTag" tagprefix="uc1" %>
. . .
<uc1:AnchorTag ID="AnchorTag1" runat="server" />
. .
And it renders as expected:
<a href="#" id="AnchorTag1_A1">Anchor Tag</a>
Please correct me if I'm doing something which is not expected...
This should work.
<a href="javascript:void(0)">text</a>
This should work.
<a href="~/#">text</a>
I ran into the same thing. If you set this on page load, it will work:
AppRelativeTemplateSourceDirectory = "";
What about this?
HtmlAnchor errorLink = new HtmlAnchor();
errorLink.InnerText = this.Message;
errorLink.HRef = errorLink.ResolveClientUrl("#" + this.FormControlId);
errorLink.Attributes["rel"] = "form_help";
Works for me but I'm using a Server Control in a Class Library as opposed to a User Control. I think it should work for a User Control as well.
Originally I had this as a comment but by request I'm adding it as an answer since nobody else has explained why the original behavior is occurring or how to directly prevent it.
The URL rewriting is caused by the method ResolveURL on the Control class. I looked at it in Reflector and found that it will attempt to rewrite anything that it thinks is a relative URL if AppRelativeTemplateSourceDirectory is non-empty.
The simple workaround is to set this variable on the Page object to an empty string at some global level (or at least before Render), although this could be an issue if some other bit of your control structure requires it to be empty.
I suppose a true fix would be to get Microsoft to make UrlPath.IsRelativeUrl() smarter.