【问题标题】:asp.net user control, getting htmlAnchor resolve to href="#"asp.net 用户控件,获取 htmlAnchor 解析为 href="#"
【发布时间】:2009-09-28 20:57:13
【问题描述】:

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

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

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

编辑:语法。

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

【问题讨论】:

  • 不应该将其命名为“简单的 Asp.Net 问题”吗?
  • 不,它的标题应该类似于“如何使用 href='#' 创建 HTML 锚点?” “简单的 Asp.Net 问题”更正确,但在搜索中同样无用。
  • 根据请求/点更改标题。
  • 轻松 +1 以主动尝试提高问题质量。
  • 我已经尝试在后面的代码中添加'href'属性,但它仍然解析为控制路径。

标签: c# asp.net user-controls


【解决方案1】:

我遇到了同样的问题,下面是我可以解决的方法:

原始代码

用户控制:

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

【讨论】:

  • 谢谢,这很有帮助。这个问题让我发疯了
  • 这是一个比上述解决方案更可取的解决方案,但在页面下方有相当大的距离!
【解决方案2】:

在使用 PageParser.GetCompiledPageInstance() 渲染页面或重写 url 时,我遇到了类似的问题。由于某种原因,HtmlAnchor 总是无法正确解析(类似于您上面的内容)。

最终只使用了 HtmlGenericControl,因为无论如何您都是在服务器端操作它,这对您来说可能是一种可能性。

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

【讨论】:

  • URL重写是由Control类的ResolveURL方法引起的。我在 Reflector 中查看了它,发现如果 AppRelativeTemplateSourceDirectory 不为空,它将尝试重写它认为是相对 URL 的任何内容。简单的解决方法是在某个全局级别(或至少在渲染之前)将 Page 对象上的此变量设置为空字符串。我想一个真正的解决办法是让微软让 UrlPath.IsRelativeUrl() 更智能。
  • Ramses 的解决方案要干净得多,因为在asp.net 中对链接有特定的控制。为什么要使用通用的?
  • @Sorpigal,您的解决方案是迄今为止最好的。我不需要其他人将所有相对路径转换为他们认为对我来说正确的路径。我知道我的文件到底在哪里。我建议发布您的解决方案作为答案以获得更多宣传。
  • @AaA:考虑到我认为你可能是对的,所以按照你的要求完成了。
【解决方案3】:

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

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

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

我认为真正的解决办法是让 Microsoft 让 UrlPath.IsRelativeUrl() 更智能。

【讨论】:

    【解决方案4】:

    Brendan Kowitz 解决方案将起作用,但是由于此控件的操作方式,我无法实施它。我最终不得不按照后面代码中的以下代码破解它:

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

    其中 lnk 是一个 HtmlAnchor。

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

    【讨论】:

      【解决方案5】:

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

      AppRelativeTemplateSourceDirectory = "";
      

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

        • 删除 runat="server" 不是一个选项,因为其他属性在后端发生了变化。这只是一个简化。
        【解决方案7】:

        这应该可行。

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

        这应该可行。

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

        【讨论】:

        • 要清楚,这个答案将提供具体要求的内容......('#'字符),但如果所有 OP 可能就足够了需要做的是有一个“什么都不做”的链接。
        • 这个例子是为了简化问题。我只是在语法上希望遵循 href="#"。锚标记还有其他一些属性。
        【解决方案8】:

        我的也很好用……我有一个用户控件 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>
        

        如果我做的事情不是预期的,请纠正我......

        【讨论】:

        • 控件位于单独的文件夹中。特别是项目/UserControls/myControl.ascx。该页面位于文件夹 project/Crud/MyPage.aspx 中。我每次都能复制这个功能。
        【解决方案9】:

        编辑:包括嵌套路径

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

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

        【讨论】:

        • 控件在路径 Project/userControls/myControl.ascx 页面在路径 Project/CRUD/page.aspx 它在转发器中,但转发器外部的功能相同
        • 废话,忘了嵌套路径,我会测试一下。
        【解决方案10】:

        这个怎么样?

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-06-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-15
          • 2014-06-07
          相关资源
          最近更新 更多