Verwendung von Tilde (~) im asp.net-Pfad

75

Ich arbeite an einer asp.net-App. Der folgende Link funktioniert im IE, aber nicht in FF.

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

Ist die Tilde nicht etwas, das nur in asp.net-Serversteuerelementen verwendet werden kann? Wo wird es durch einen tatsächlichen Pfad ersetzt?

Ist es möglich, die Tilde in einem Ankertag zu verwenden? Wenn ja, was bedeutet das?

Wenn ich an der Wurzel bin, funktioniert der Link

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

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

Der von ASP.NET generierte Link lautet:

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

Ist das beabsichtigt?

Michel
quelle
2
Der ~heißt übrigens Application Root Operator, falls Sie danach googeln
KyleMit

Antworten:

95

Sie haben Recht, es funktioniert nur in Serversteuerelementen. Sie haben folgende grundlegende Optionen:

Wechseln Sie zu HyperLink, um als Web Control ausgeführt zu werden :

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

Oder führen Sie den Anker auf der Serverseite als HTML-Steuerelement aus :

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

Oder verwenden Sie Page.ResolveUrl:

<a href="<%= Page.ResolveUrl("~/BusinessOrderInfo/page.aspx") %>">...</a>
Dean Harding
quelle
Warum können Sie nicht einfach <a href="BusinessOrderInfo/page.aspx"> verwenden?
Jamie Kitson
12
@JamieKitson Wenn Sie dies tun, funktioniert es nur, wenn der Pfad relativ zum aktuellen Standort des Benutzers auf der Site korrekt ist. Sie fragen sich vielleicht auch, warum Sie nicht einfach <a href="https://stackoverflow.com/BusinessOrderInfo/page.aspx" >für den absoluten Pfad verwenden. Tun Sie dies auch nicht, da dies nur funktioniert, wenn Sie Ihre Web-App im Stammverzeichnis der Domain (z. B. www.example.com) bereitstellen. Es funktioniert jedoch nicht, wenn Sie in einem Unterverzeichnis bereitstellen (z. B. www.example.com/MyAppRoot). Es ist immer am besten sicherzustellen, dass Sie App-Root-bezogene URLs (die mit dem ~) verwenden, um sicherzustellen, dass Ihre Web-App portabel ist.
Jesse Webb
1
Ich denke, Sie müssen runat = "server" in das Head-Tag einfügen, damit das Link-Tag aufgelöst wird.
Tillito
Das Hinzufügen von runat = "server" kann in bestimmten Tags Nebenwirkungen verursachen. Vor allem das Skript-Tag.
Daniel Santos
Welches ist im Code dahinter richtig Response.Redirect("webform2.aspx")oder Response.Redirect("~/webform2.aspx")?
Dylan Czenski
21

HTML-Steuerelemente können durch Hinzufügen des Attributs runat = "server" in Serversteuerelemente umgewandelt werden.

<a href="~/BusinessOrderInfo/page.aspx" runat="server">
Damien Dennehy
quelle
Beachten Sie, dass der Nachteil darin besteht, dass die Leistung beeinträchtigt wird, da die Bild-Tags in Serversteuerelemente konvertiert werden, wenn die Seite generiert werden muss, obwohl dies nicht wirklich erforderlich ist.
Atconway
Dies scheint auch zu funktionieren, wenn das Container-Tag runat = "server" enthält, zumindest mit <head runat = "server">, wenn mein Favicon im Root-Pfad leben und von jedem Pfad aus zugänglich sein soll, der my verwendet Masterseite
Matthew Lock
11

Die Tilde verweist auf das Anwendungsstammverzeichnis und wird in Steuerelementeigenschaften wie NavigateUrl korrekt übersetzt.

Ich verstehe, dass wenn Sie es in einfachen HTML-Tags verwenden, es nicht von ASP.Net übersetzt wird.

devio
quelle
8
Dies ist meistens wahr. Wenn Sie ein einfaches HTML-Tag wie <img /> verwenden und ihm einen runat = "Server" geben, können Sie erfolgreich einen virtuellen Pfad verwenden, um auf Ihren Inhalt zu verweisen.
Nathan Taylor
0

Wenn Sie Tilde entfernen und nur Schrägstrich verwenden, erzielen Sie dasselbe Ergebnis, dh Sie zeigen auf den Stammordner in der aktuellen Domäne:

<a href="/BusinessOrderInfo/page.aspx" >
boateng
quelle
-1

Diese Funktion kann auch zum Auflösen von Pfaden für Nicht-Server-Elemente verwendet werden

VirtualPathUtility.ToAbsolute($"~/App_Themes/Default/Icons/myimage.gif")
Dbl
quelle