【问题标题】:Why does ASP.Net rewrite relative paths for runat=server anchor controls?为什么 ASP.Net 重写 runat=server 锚控件的相对路径?
【发布时间】:2011-01-31 07:42:37
【问题描述】:

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

/Controls/TheControl.ascx

如果指定以下内容:

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

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

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

为什么 Asp.Net 会重写这些控制路径,有没有优雅的方法来修复它?

我只想让锚控件准确地吐出我告诉它的内容!!!有那么难吗?

编辑:

我基本上已经按照 Kelsey 的建议做了。我知道我可以这样做,但是当我想要一些相对简单的东西时,我不喜欢在我的代码中添加标记。至少它解决了问题:

aspx 页面:

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

正如您从本质上应该是一个简单且轻量级的锚所需的代码量中看到的那样,这并不是最佳解决方案。我知道我可以使用 Literal,但我认为这更干净,因为我要添加多个锚点。

我很想知道为什么 ASP.Net 接管并尝试修复我的 URL。

【问题讨论】:

  • 只有微软知道为什么会发生不必要的事情。这就是为什么它们受到如此广泛的喜爱和尊重。

标签: asp.net html anchor relative-path


【解决方案1】:

为什么你定义了runat="server" 而没有定义ID?你需要访问它的服务器端吗?如果您删除 runat="server",一切都会按预期工作。

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

编辑:您可以通过使用Literal 控件然后将原始&lt;a href... 输出到它来解决此问题。

例如:

<asp:Literal ID="myLiteral" runat="server" />

myLiteral.Text = "<a href=\"./?pg=1\">link text</a>";

然后您可以根据需要在Literal 上设置可见属性。

【讨论】:

  • 是的。我正在控制它的可见属性。为了简单起见,我将其省略了,因为 id 将在客户端上被删除。我加一个进去。
  • 谢谢,这基本上是我最终做的。我有一个 PlaceHolder 并生成一个 HtmlGenericControl("a")
【解决方案2】:

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

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

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

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

无论如何,我想我会发帖以防其他人在这里遇到同样的问题。

【讨论】:

    【解决方案3】:

    最好的办法是使用魔术 ~/ 引导所有应用程序根目录到 url。这往往会使事情保持直截了当。

    【讨论】:

    • 这并不能解决问题。此用户控件可用于多个页面。
    • 事实上,确实如此。相对 url 引用解析为正确的 approot 相对 url。每时每刻。有规律的。还有帽子。
    【解决方案4】:

    您的问题没有很好的答案。 ASP.NET 会将 UserControl 中的相对路径视为相对于用户控件的路径。

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

    替代方案是使用像 Kelsey 建议的字面量,或者我会尝试将应用程序的所有内容映射到 ~/ 就像 Wyatt 建议的那样。

    【讨论】:

    • 这很烦人。实际上,我尝试在 Code-Behind 中生成一个 HtmlAnchor,它的作用与 相同
    【解决方案5】:

    即使是文字也不能使用 ICallBackEventHandler 和 RenderControl 至少...我最终在客户端破解了标签:/例如在 JQuery 中:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-20
      • 2010-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-16
      相关资源
      最近更新 更多