Почему ASP.NET переписывает относительные пути для runat=server средств управления привязки?

У меня есть свой 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. Сеть переписывает эти пути управления, и есть ли изящный способ зафиксировать ее?

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

Править:

Я в основном сделал что предложенный 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);

Как Вы видите объемом кода, необходимым для того, что, как по существу предполагается, быть простой и легкой привязкой, это не наиболее оптимальное решение. Я знаю, что мог использовать Литерал, но я полагал, что это было более чисто, поскольку я добавляю больше чем одну привязку.

Я был бы интересен в знании, ПОЧЕМУ ASP.NET вступает во владение и пытается зафиксировать мой URL, все же.

5
задан Armstrongest 24 March 2010 в 19:13
поделиться

4 ответа

Почему у вас runat = "server" и нет ID ] определенный? Вам нужен доступ к нему на стороне сервера? Если вы удалите runat = "server" , все будет работать должным образом.

Для получения дополнительной информации о том, как ASP.NET обрабатывает пути, ознакомьтесь с этой статьей MSDN .

Изменить: Вы можете обойти проблему, используя элемент управления Literal и затем выводя в него необработанные .

Например:

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

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

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

4
ответ дан 13 December 2019 в 22:05
поделиться

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

1
ответ дан 13 December 2019 в 22:05
поделиться

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

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

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

1
ответ дан 13 December 2019 в 22:05
поделиться

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

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

Затем в приведенном ниже коде я сослался на него, используя HtmlGenericControl, и затем могу сделать это:

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

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

4
ответ дан 13 December 2019 в 22:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: