Почему ASP.Net переписывает относительные пути для элементов управления runat = server? - PullRequest
5 голосов
/ 24 марта 2010

Мои решения 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 переписывает эти пути управления и существует ли элегантный способ исправить это?

Я просто хочу, чтобы элемент управления привязки выплевывал именно то, что я ему говорю !!! Это так сложно?

EDIT:

Я в основном сделал то, что предложил Келси. Я знал, что могу сделать это таким образом, но мне не нравится добавлять разметку в мой код, когда я хочу что-то относительно простое. По крайней мере, это решает проблему:

Страница 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.

Ответы [ 5 ]

4 голосов
/ 25 июня 2010

Я знаю, что это немного старая тема, но я тоже столкнулся с этой проблемой и в конце концов выбрал похожее решение, но смог сохранить несколько строк кода, выполнив это в ascx:

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

Затем в коде я ссылаюсь на него с помощью HtmlGenericControl и могу сделать это:

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

Во всяком случае, я подумал, что буду публиковать на тот случай, если кто-то еще наткнется здесь с той же проблемой.

4 голосов
/ 24 марта 2010

Почему у вас есть 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>";

Затем вы можете установить свойство visible на Literal так, как хотите.

1 голос
/ 24 марта 2010

Нет хорошего ответа на ваш вопрос. ASP.NET будет обрабатывать относительный путь в UserControl относительно пути пользовательского элемента управления.

Что вы можете сделать, так это в коде своего пользовательского элемента управления установить свойство HRef вашего тега привязки на основе свойства Request.Path. Затем вы можете создавать URL-адреса относительно страницы.

Альтернативой является использование литерала, подобного предложенному Келси, или я просто попытался бы сопоставить все приложения относительно ~ /, как предложил Вайетт.

1 голос
/ 24 марта 2010

Лучше всего сделать все приложение корневым, используя магию ~ / ввод в URL. Это имеет тенденцию держать вещи прямо.

0 голосов
/ 25 ноября 2013

Даже литерал не работает, по крайней мере, с использованием ICallBackEventHandler и RenderControl ... Я закончил тем, что взломал тег обратно на стороне клиента: / например, в JQuery:

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