代码之家  ›  专栏  ›  技术社区  ›  Armstrongest

为什么ASP.Net要重写runat=server锚控件的相对路径?

  •  5
  • Armstrongest  · 技术社区  · 16 年前

    我在解决方案的~/Controls文件夹中有UserControls:

    /Controls/TheControl.ascx
    

    <a id="theId" runat="server" href="./?pg=1">link text</a>
    

    Net似乎想重写指向绝对位置的路径。例如,如果控件位于site.com/products/fish/cans.aspx,则链接href将被重写为

    <a id="munged_theId" href="../../Controls/?pg=1>link text</a>
    

    我只想锚控制吐出准确的我告诉它!!!有那么难吗?

    编辑:

    <asp:PlaceHolder ID="ph" runat="server"></asp:PlaceHolder>
    

    代码隐藏:

    var anchor = new HtmlGenericControl("a") { InnerText = "Previous" + " " + PageSize) };
    anchor.Attributes["href"] = "?pg=" + (CurrentPage - 1);
    anchor.Attributes["class"] = "prev button";
    ph.Controls.Clear();
    ph.Controls.Add(anchor);
    

    从基本上应该是一个简单而轻量的锚点所需的代码量可以看出,它不是最理想的解决方案。我知道我可以使用文字,但我认为这是更干净的,因为我添加了一个以上的锚。

    5 回复  |  直到 16 年前
        1
  •  4
  •   Kelsey    16 年前

    为什么你有 runat="server" 而且没有 ID 定义?您需要访问it服务器端吗?如果你移除 runat=“服务器”

    有关ASP.NET如何处理路径的详细信息,请查看 MSDN article .

    你可以通过使用 Literal 控件,然后输出原始 <a href... 去吧。

    <asp:Literal ID="myLiteral" runat="server" />
    
    myLiteral.Text = "<a href=\"./?pg=1\">link text</a>";
    

    然后可以在 字面意义的 随你怎么想。

        2
  •  4
  •   Eric    16 年前

    我知道这是一个有点老的话题,但我也遇到了这个问题,并最终采用了类似的解决方案,但通过在ascx中执行此操作,可以节省几行代码:

    <anchor id="myAnchor" runat="server" href="xxx">link text</anchor>
    

    在后面的代码中,我使用HtmlGenericControl引用了它,然后可以这样做:

    myAnchor.TagName = "a";
    // other properties set as needed
    

    不管怎样,我想我应该发个帖子,以防有人在这里碰到同样的问题。

        3
  •  1
  •   Wyatt Barnett    16 年前

    最好的办法是使用magic~/lead-in将所有app root都与url相对。这有助于保持事情的公正性。

        4
  •  1
  •   Andrew Barrett    16 年前

    您可以在用户控件的代码隐藏中,根据Request.Path属性设置锚定标记的HRef属性。然后可以创建相对于页面的URL。

    另一种方法是使用像Kelsey was建议这样的文字,或者我会像Wyatt建议的那样,尝试用~/映射所有应用程序相关的内容。

        5
  •  0
  •   DaniP    12 年前

    $('#munged_theId').attr('href', './?pg=1');
    
    推荐文章