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?


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>

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">

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.


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" >

-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")
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.