24 Stimmen

Gibt es ResolveUrl/ResolveClientUrl-Äquivalente für Asp.Net Razor?

Ich bin also dazu übergegangen, die Syntax <%: Url.Content(~/site/blah) %> standardmäßig für CSS, JScript und Bild-URLs zu verwenden - löst in der Tat viele Probleme; und es ist zumindest konsistent zwischen WebForms und Razor-Seiten (nicht alle meine Entwickler werden Razor verwenden, und dennoch werden sie weiterhin an dieser Plattform arbeiten, die ich erstellt habe).

Für etwas, das ich gerade mache, könnte ich jedoch wirklich eine Möglichkeit gebrauchen, eine relative URL, die in einer Razor-Seite geschrieben wurde, zur Laufzeit in die entsprechende serverseitige Datei aufzulösen, bevor sie wieder in eine absolute URL für den Client umgewandelt wird. Url.Content macht nichts mit relativen URLs.

Also möchte ich im Grunde genommen ein Äquivalent von ResolveUrl oder ResolveClientUrl auf Razor-Ebene haben.

Ich möchte damit kürzere (und tolerantere gegenüber Umbenennungen) Ressourcenpfade in einigen meiner MVC-Ansichten ermöglichen, die einige Ordner weiter unten im Stammverzeichnis liegen und deren Inhaltsordner leichter als relativer Pfad ausgedrückt werden könnten - also könnte ich haben:

folder\folder\views\shared\layout.cshtml
und
folder\folder\content\site.css

(Ich habe auch die Verwendung einer Layoutseite abgeleitet, um die Art von Problemen nachzubilden, die durch ResolveUrl und das erneute Basieren, das WebForms durchführt, behandelt werden)

Wenn ich Url.Content so verwende, wie es ist, müsste ich den vollständigen Pfad angeben:

Url.Content("~/folder/folder/content/site.css")

Aber was ich gerne hätte ist:

Url.Content("../../site.css")

Und dass das natürlich funktioniert, unabhängig davon, wie viele Pfade im aktuellen Anforderungsrouten vorhanden sind.

Natürlich kann ich das in WebForms zum Laufen bringen, wenn ich den Aufruf von Url.Content verwerfe und mich nur auf das Neubasieren von URLs verlasse.

Gibt es ein Äquivalent in Razor?

36voto

Alexander Prokofyev Punkte 32808

Sie könnten versuchen, die WebPageRenderingBase.Href Methode wie folgt zu verwenden

@Href("../../site.css")

1voto

Tomas Kubes Punkte 21732

Wenn Sie eine ASP.NET-Anwendung ASP.NET MVC schrittweise konvertieren, können Sie Wrapper verwenden:

public abstract class ResolveClientUrlWrapper
{
    public abstract string ResolveClientUrl(string relativeUrl);
}

public class ResolveClientUrlPageWrapper : ResolveClientUrlWrapper
{
    System.Web.UI.Page _page;

    public ResolveClientUrlPageWrapper(System.Web.UI.Page page)
    {
            _page = page;
    }

    public override string ResolveClientUrl(string relativeUrl)
    {
        return _page.ResolveClientUrl(relativeUrl);
    }
}

public class ResolveClientUrlPWebPageRenderingBaseWrapper : ResolveClientUrlWrapper
{
    WebPageRenderingBase _webPageRenderingBase;

    public ResolveClientUrlPWebPageRenderingBaseWrapper(WebPageRenderingBase webPageRenderingBase)
    {
        _webPageRenderingBase = webPageRenderingBase;
    }

    public override string ResolveClientUrl(string relativeUrl)
    {
        return _webPageRenderingBase.Href(relativeUrl);
    }
}

public class ResolveClientUrlUrlHelperWrapper : ResolveClientUrlWrapper
{
    UrlHelper _urlHelper;

    public ResolveClientUrlUrlHelperWrapper(UrlHelper urlHelper)
    {
        _urlHelper = urlHelper;
    }

    public override string ResolveClientUrl(string relativeUrl)
    {
        return _urlHelper.Content(relativeUrl);
    }
}

public class PathUtilityWrapper : ResolveClientUrlWrapper
{
    public override string ResolveClientUrl(string relativeUrl)
    {
        return VirtualPathUtility.ToAbsolute(relativeUrl);
    }
}

Sie können ResolveClientUrlPageWrapper von einer klassischen ASP.NET-Seite oder ResolveClientUrlHttpServerUtilityBaseWrapper von einem ASP.NET MVC-Controller verwenden, ResolveClientUrlUrlHelperWrapper von einer ASP.NET MVC-Ansicht. Sie haben denselben Hintergrundcode für die gesamte klassische ASP.NET und ASP.NET MVC-Anwendung.

0voto

Sunil Johnson Punkte 929

Im Allgemeinen mache ich es auf diese Weise in meinem JavaScript-Code.

var imgUrl = '@Href("~/images/calendar.png")'

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X