Asp.Net非常聪明,如果您将〜/放在开头,则会尝试相对于它所在的控件或相对于应用程序根目录解析超链接的NavigateUrl

但是我遇到一种情况,我想将URL显式设置为相对路径,而我根本不希望它“帮助”我。

超链接的导航URL和HtmlAnchor的href属性都表现出这种行为。
是否可以停止这种行为-还是我必须手动生成标记而不使用控件?

,例如
我在包含[appRoot]/foo/barasp:Hyperlinks文件夹中有一个用户控件。
我正在使用[appRoot]/myPage.aspx页面中的控件。
我希望超链接的href属性在呈现时与'donkey.gif'完全相等。

但是如果我写以下内容

 <asp:Hyperlink runat="server" NavigateUrl="donkey.gif" />

那么呈现的href将是'foo/bar/donkey.gif'

出于复杂的原因,我不希望在这里讨论,因此不建议使用“〜/donkey.gif”。
另外,我不能使用ResolveUrl(string url)生成绝对URL。

最佳答案

您不能简单地使用HTML anchor (没有runat="server"属性)吗?例如:

<a href="relative.htm">link text</a>

更新:如果您不想丢失HyperLink控件的功能,则可以创建一个从HyperLink派生的控件,并覆盖AddAttributesToRender()方法(这是NavigateUrl的解决方法)。
HyperLink.AddAttributesToRender()看起来像这样:
protected override void AddAttributesToRender(HtmlTextWriter writer)
{
    ...
    string navigateUrl = this.NavigateUrl;
    if (navigateUrl.Length > 0 && base.IsEnabled)
    {
        string str = base.ResolveClientUrl(navigateUrl);
        writer.AddAttribute(HtmlTextWriterAttribute.Href, str);
    }
    ...
}

自定义HyperLink控件:
public class MyHyperLink : HyperLink
{
  protected override void AddAttributesToRender(HtmlTextWriter writer)
  {
    if ((base.Enabled && !base.IsEnabled) && base.SupportsDisabledAttribute)
    {
      writer.AddAttribute(HtmlTextWriterAttribute.Disabled, "disabled");
    }
    base.AddAttributesToRender(writer);
    if (this.NavigateUrl.Length > 0 && base.IsEnabled)
    {
      writer.AddAttribute(HtmlTextWriterAttribute.Href, this.NavigateUrl);
    }
    if (this.Target.Length > 0)
    {
      writer.AddAttribute(HtmlTextWriterAttribute.Target, this.Target);
    }
  }
}

关于asp.net - 我可以在超链接上明确指定NavigateUrl吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6262161/

10-10 21:57