Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does ASP.Net rewrite relative paths for runat=server anchor controls?

I have my UserControls in a ~/Controls folder in my solution:

/Controls/TheControl.ascx

If specify the following:

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

ASP.Net seems to want to rewrite the path to point to the absolute location. For example, If the control is on site.com/products/fish/cans.aspx the link href will be rewritten to read

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

Why does Asp.Net rewrite these control paths, and is there an elegant way to fix it?

I just want the anchor control to spit out exactly what I tell it to!!! Is that so hard?

EDIT:

I've basically done what Kelsey suggested. I knew I could do it this way, but I don't like adding markup in my code when I want something relatively simple. At least it solves the problem:

Aspx page:

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

Code-behind:

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

As you can see by the amount of code needed for what is essentially supposed to be be a simple and light-weight anchor, it's not the most optimal solution. I know I could use a Literal but I figured this was cleaner as I'm adding more than one anchor.

I would be interesting in knowing WHY ASP.Net takes over and tries to fix my URL, though.

like image 477
Armstrongest Avatar asked Mar 24 '10 15:03

Armstrongest


People also ask

What is the use of Runat property in ASP NET controls?

The runat="server" tag in ASP.NET allows the ability to convert/treat most any HTML element as a server-side control that you can manipulate via code at generation time. Some controls have explicit implementations, others simply revert to a generic control implementation.

What is Runat server in C#?

Runat='Server ' Indicates the accessibility of the control at Serverside. Let Me make you more clear about it. If you puts runat="server" inside any of the control then you can use that control at the server side. e.g. XML.

What is form Runat server?

The runat="server" attribute indicates that the form should be processed on the server. It also indicates that the enclosed controls can be accessed by server scripts. In the following example we declare an HtmlAnchor server control in an .aspx file.


3 Answers

Why do you have runat="server" and no ID defined? Do you need to access it server side? If you remove the runat="server" everything will work as expected.

For more information regardinging how ASP.NET handles paths check out this MSDN article.

Edit: You can get around the problem then by using a Literal control and then outputing the raw <a href... to it.

Eg:

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

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

Then you can set the visible property on the Literal however you want.

like image 76
Kelsey Avatar answered Nov 03 '22 01:11

Kelsey


I know this is a bit of an old topic, but I was running into this problem as well and in the end went with a similar solution, but was able to save a few lines of code by doing this in the ascx:

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

Then in the code behind, I referenced it using an HtmlGenericControl and can then do this:

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

Anyway, I thought I'd post in case anyone else stumbles in here with the same issue.

like image 45
Eric Avatar answered Nov 03 '22 01:11

Eric


Best bet is to make everything app root relative using the magic ~/ lead-in to the url. That tends to keep stuff straight.

like image 25
Wyatt Barnett Avatar answered Nov 03 '22 01:11

Wyatt Barnett