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

7

我在解决方案中的~/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。


1
只有微软知道为什么不必要的事情需要发生。这就是为什么他们如此广受喜爱和尊重的原因。 - user1566694
5个回答

4

我知道这个话题有点老了,但是我也遇到了这个问题,最终选择了类似的解决方案,但通过在ascx中进行以下操作,我能够节省几行代码:

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

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

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

无论如何,我想发帖是为了让其他遇到同样问题的人可以参考。

4
为什么你有 runat="server" 但没有定义 ID?你需要在服务器端访问它吗?如果你移除 runat="server",一切都会按预期工作。
有关 ASP.NET 如何处理路径的更多信息,请查看此MSDN文章编辑:你可以通过使用 Literal 控件并将原始的 <a href... 输出到其中来解决这个问题。
例如:
<asp:Literal ID="myLiteral" runat="server" />

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

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


是的,我正在控制它的可见属性。出于简单起见和因为ID将在客户端上被混淆,我将其省略了。我会添加一个进去的。 - Armstrongest
谢谢,这基本上就是我最终所做的。我有一个PlaceHolder并生成了一个HtmlGenericControl("a")。 - Armstrongest

1

最好的方法是使用神奇的~/作为URL的前缀,使所有内容都相对于应用程序根目录。这样可以保持一切井然有序。


那并不能解决问题。这个用户控件可以在多个页面上使用。 - Armstrongest
实际上,它确实如此。相对URL引用将始终解析为正确的应用程序根相对URL。像钟表一样稳定。而且大写字母也是如此。 - Wyatt Barnett

1

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

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

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


真的很烦人。实际上,我尝试在代码后台生成一个HtmlAnchor,它与<a runat=server>的效果相同。 - Armstrongest

0

即使使用ICallBackEventHandler和RenderControl,甚至一个字面量也无法工作...最终我只能在客户端上黑掉标签 :/ 例如在JQuery中:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接