У меня есть свой 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, все же.
Почему у вас 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
, как хотите.
Лучше всего сделать все приложения корневыми, используя магический ввод ~ / для URL. Это, как правило, сохраняет вещи прямо.
На ваш вопрос нет однозначного ответа. ASP.NET будет обрабатывать относительный путь в UserControl как относительный путь к пользовательскому элементу управления.
Что вы можете сделать, так это в коде вашего пользовательского элемента управления установить свойство HRef вашего тега привязки на основе свойства Request.Path. Затем вы можете создавать URL-адреса относительно страницы.
Альтернативой является использование литерала, подобного предложению Келси, или я бы просто попытался сопоставить все относительное приложение с помощью ~ /, как предложил Вятт.
Я знаю, что это немного старая тема, но я тоже столкнулся с этой проблемой и в конце концов пошел с аналогичным решением, но смог сэкономить несколько строк кода, сделав это в ascx:
<anchor id="myAnchor" runat="server" href="xxx">link text</anchor>
Затем в приведенном ниже коде я сослался на него, используя HtmlGenericControl, и затем могу сделать это:
myAnchor.TagName = "a";
// other properties set as needed
В любом случае, я решил опубликовать сообщение на случай, если кто-то еще наткнется здесь с той же проблемой.