Was entspricht Page.ResolveUrl in ASP.NET MVC?

73

Was entspricht Page.ResolveUrl in ASP.NET MVC, das auf dem Controller verfügbar ist?

Mark Redman
quelle

Antworten:

110

Es ist Url.Content :

ASPX:

<link rel="stylesheet" href="<%= Url.Content("~/Content/style.css") %>" type="text/css" />

Rasierer:

<link rel="stylesheet" href="@Url.Content("~/Content/style.css")" type="text/css" />
Atanas Korchev
quelle
4
Und übersehen Sie nicht das "~ /" bisschen wie ich, wie es wichtig ist
Slider345
41

Dies sollte tun, was Sie suchen ...

System.Web.VirtualPathUtility.ToAbsolute ("~ /")
Carlo
quelle
2
Obwohl ich meistens Url.Content verwende, kann diese Methode nützlich sein, da sie statisch ist und keinen Anforderungskontext wie Url.Content erfordert.
R. Schreurs
Dies kann auf einer .ascx-Datei verwendet werden, die sowohl von Webformularen als auch von MVC verwendet wird.
Kevinpo
6

Hier finden Sie eine Reihe von Möglichkeiten zum Auflösen eines Pfads, der diesen Anwendungsstammoperator verwendet ( ~)

Um eine Methode mit Inline-Code auf einer asp.net-Seite aufzurufen, muss die Methode entweder als Instanzvariable für das aktuelle Objekt verfügbar gemacht werden oder als statische / gemeinsam genutzte Methode verfügbar sein.

Über eine typische MVC-Seite können wir über das auf einige dieser Eigenschaften zugreifen WebViewPage. @ViewDataHaben Sie sich jemals gefragt , ob Sie beim Tippen auf magische Weise mit den ViewData verbunden werden? Dies liegt daran, dass Sie eine Eigenschaft getroffen haben, die von der MVC-Seite angezeigt wird, auf der Sie sich befinden.

Um diese Methoden aufzurufen, beziehen wir uns nicht unbedingt auf den Typ, den sie darstellen, sondern auf die Instanzeigenschaft, die sie verfügbar macht.

Wir können die obigen Instanzmethoden wie folgt aufrufen:

href="@Url.Content("~/index.html")" 
href="@Server.MapPath("~/index.html")" 
href="@Href("~/index.html")" 

Wir können dies tun, um eine gemeinsam genutzte Methode aufzurufen, die keine Instanz benötigt:

href="@VirtualPathUtility.ToAbsolute("~/index.html")"

AFAIK, eine MVC-Seite erstellt nicht automatisch eine Instanz von irgendetwas aus dem System.Web.UI-Namespace, von dem ResolveUrlerbt. Wenn Sie aus irgendeinem Grund wirklich diese bestimmte Methode verwenden wollten, könnten Sie einfach ein Steuerelement neu erstellen und die darin enthaltenen Methoden verwenden, aber ich würde es wärmstens empfehlen .

@Code
    Dim newControl As New System.Web.UI.Control
    Dim resolvedUrl = newControl.ResolveUrl("~/index.html")
End Code
href="@resolvedUrl" 

Trotzdem würde ich empfehlen, @Url.Contentes zu verwenden, da es am besten zu MVC-Paradigmen passt

KyleMit
quelle
0

In Razor v2.0 / ASP.NET MVC 4 müssen Sie dies nicht mehr tun.

Verwenden Sie einfach das "~" auf einer Rasierseite und es wird es für Sie lösen.

<link rel="stylesheet" href="~/Content/style.css" type="text/css" />

Quelle

Carter Medlin
quelle
-4
Server.MapPath() //returna full path

oder

url.content()
Paul Creasey
quelle
Gibt Server.MapPath () nicht den Pfad der physischen Festplatte zurück, anstatt eine vollständige URL wie Page.ResolveUrl ("~") zu erweitern?
Mark Redman
1
Ja, du hast Recht, du könntest es umgehen, url.contentist aber stattdessen verfügbar!
Paul Creasey
-6

Versuchen Sie es mit Server.MapPath ().

Ashish Gupta
quelle