використання тильди (~) у шляху asp.net


75

Я працюю над додатком asp.net, таке посилання працює в IE, але не в FF.

<a href="~/BusinessOrderInfo/page.aspx" >

Чи не є тильда тим, що можна використовувати лише в елементах керування сервером asp.net. Де його замінить фактичний шлях?

Чи можна використовувати тильду в анкерній мітці? Якщо так, що це означає?

Коли я в корені, посилання працює

www.myserver.com/default.aspx, click the link, ok!

www.myserver.com/otherpart/default.aspx, click the link, not ok!

Посилання, створене ASP.NET:

www.myserver.com/otherpart/~BusinessOrderInfo/page.aspx

Це за задумом?


2
Це ~називається Application Root Operator btw на випадок, якщо ви на нього
гуглите

Відповіді:


95

Ви праві, це працює лише в елементах керування сервером. У вас є такі основні варіанти:

Змініть на, HyperLinkщоб працювати як веб-елемент керування :

<asp:HyperLink NavigateUrl="~/BusinessOrderInfo/page.aspx" Text="Whatever" runat="server" />

Або запустіть прив’язку на стороні сервера як елемент керування HTML :

<a href="~/BusinessOrderInfo/page.aspx" runat="server" >

Або використовуйте Page.ResolveUrl:

<a href="<%= Page.ResolveUrl("~/BusinessOrderInfo/page.aspx") %>">...</a>

Чому ви не можете просто використовувати <a href="BusinessOrderInfo/page.aspx">?
Джеймі Кітсон,

12
@JamieKitson Якщо ви це зробите, це спрацює, лише якщо шлях правильний щодо поточного місцезнаходження користувача на сайті. Ви також можете задатися питанням, чому б просто не використовувати <a href="https://stackoverflow.com/BusinessOrderInfo/page.aspx" >абсолютний шлях. Не робіть цього також, оскільки це буде працювати, лише якщо ви розгорнете свою веб-програму в кореневій частині домену (наприклад, www.example.com). Однак це не спрацює, якщо ви розгортаєтесь у підкаталозі (наприклад, www.example.com/MyAppRoot). Завжди найкраще переконатися, що ви використовуєте URL-адреси, пов’язані з коренем програми (ті, що мають ~), щоб переконатись, що веб-програма є портативною.
Джессі Вебб

1
Я думаю, що вам потрібно вставити runat = "server" в тег заголовка, щоб тег посилання був вирішений.
Tillito

Додавання runat = "server" може спричинити побічні ефекти у певних тегах. Найголовніше тег сценарію.
Даніель Сантос,

У коді ззаду, який з них правильний, Response.Redirect("webform2.aspx")чи Response.Redirect("~/webform2.aspx")?
Ділан Ченскі

21

Елементи керування HTML можна перетворити на серверні елементи, додавши атрибут runat = "server".

<a href="~/BusinessOrderInfo/page.aspx" runat="server">

Майте на увазі - недоліком цього є продуктивність, бо це шкодить тому, що теги зображень перетворюються на серверні елементи керування, коли сторінку потрібно генерувати, хоча в цьому насправді немає потреби.
atconway

Це також, здається, працює, якщо в тегу контейнера є runat = "server", принаймні, це відбувається з <head runat = "server">, коли хочу, щоб мій значок жив у кореневому шляху та був доступним з будь-якого шляху, який використовує мій головна сторінка
Matthew Lock

11

Тильда посилається на кореневий каталог програми і буде правильно перекладена в властивостях управління, таких як NavigateUrl.

Я розумію, що якщо ви використовуєте його в тегах із звичайним HTML, він не буде перекладений ASP.Net.


8
Це переважно так. Якщо ви використовуєте звичайний тег HTML, такий як <img />, і надаєте йому runat = "server", ви можете успішно використовувати віртуальний шлях для посилання на свій вміст.
Натан Тейлор,

0

Якщо ви видалите тильду і скористаєтеся лише косою рискою вперед, ви досягнете того самого результату, тобто вказівкою на кореневу папку поточного домену:

<a href="/BusinessOrderInfo/page.aspx" >

-1

Цю функцію також можна використовувати для вирішення шляхів для несерверних елементів

VirtualPathUtility.ToAbsolute($"~/App_Themes/Default/Icons/myimage.gif")
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.