Frage

Im normalen WebForms Szenario keine root-relative URLs (z ~ / Ordner / file.txt) innerhalb CSS-Dateien wie zum Beispiel:

.form { background-image: url(~/Content/Images/form_bg.gif); }

wird automatisch während der Laufzeit aufgelöst, wenn ich angeben

<head runat="server">

In der verweisenden Seite.

Das ist jedoch nicht mehr passiert auf einer ASP.NET MVC Beta1-Website.

Gibt es eine Möglichkeit ich diese Funktionalität ohne auf Hacks oder CSS-Loader-Datei ermöglichen könnte? Wie vielleicht Httpmodules oder etwas?

Oder bin ich meine Website nicht richtig desigining? Was sollte ein gutes Design sein?

Da Original ASP.NET WebForms bereits über diese Funktion verfügt, würde ich es vorziehen, eine vorhandene Funktionalität, wenn möglich zu nutzen. Aber ich habe nicht viel Ahnung haben.

Diese Web-Anwendung wird in verschiedenen Umgebungen eingesetzt werden, in denen die ~ Stammordner nicht offensichtlich sein könnten.


EDIT:. meine ich die URL in der Inhalt der Datei nicht die Datei url selbst

War es hilfreich?

Lösung

Ich würde nicht mit dem Auto-root-finding ~ Charakter stören. Ich verstehe, dass Sie die gleiche Lösung arbeiten mögen, wo das Root-Verzeichnis zwischen Implementierungen unterscheidet, aber in dem CSS-Dokument sollten Sie keine Probleme Pfade mit relativen haben. Die Wege in dem CSS-Dokument (auf die Bild-URL in Ihrem Beispiel) immer an die Stelle der CSS-Datei relativ sein, unabhängig von dem Weg auf einer beliebigen Seite, die die CSS-Datei lädt. Also, wenn Sie Ihre Bilder in ~/Content/Images und Ihre Stylesheets sind in ~/Content/Stylesheets sind, werden Sie immer in der Lage sein background-image: url(../Images/form_bg.gif); zu verwenden und es wird unabhängig von der Position der Seite arbeiten, die das Stylesheet geladen wird.

Gibt es einen Grund, warum dies nicht funktionieren würde?

Andere Tipps

Ein Trick, den ich in der Vergangenheit verwendet haben, war eigentlich meine CSS-Datei eine Erweiterung .aspx zu machen, und stellen Sie die Contenttype-Eigenschaft auf der Seite Signatur:

<%@ Page Language="C#" ContentType="text/css" %>

body {
    margin: 0;
    padding: 0;
    background: #C32605 url(<%= ResolveUrl("~/Content/themes/base/images/BodyBackground.png") %>) repeat-x;
    font-family: Verdana, Arial, sans-serif;
    font-size: small;
    color: #d7f9ff;
}

Dadurch wird sichergestellt, dass die CSS-Datei über das ASP.NET-Framework geht und ersetzt den Server-seitigen Code mit Ihrem relativen Pfad.

Hier sind einige Ressourcen auf die Umsetzung IHttpModule zu Intercept-Web-Anfragen, um Ihre Anwendung ...

Schreiben / Anpassung eines für Dateityp zu überprüfen (z Pseudo-Code: if (Anforderung endet mit ".css") ...)

dann einen regulären Ausdruck verwenden, um alle Instanzen von "~ /" mit System.Web.VirtualPathUtility.ToAbsolute ( "~ /")

ersetzen

Ich weiß nicht, was das für die Leistung tun, jede Anfrage durch diese Art eines Filters ausgeführt wird, aber man kann wahrscheinlich Geige mit Ihrer web.config-Datei und / oder Ihren MVC URL Routen alle CSS-Anfragen Trichter durch diese Art eines Filters, während das Überspringen Vergangenheit für andere Dateien.

Kommen Sie, daran zu denken, haben Sie wahrscheinlich die gleiche Wirkung innerhalb einer ASP.NET MVC-app durch Zeigen alle CSS refrences an einem speziellen controller.action, die diese Art der Vorverarbeitung führt für Sie erreichen können. Ich bezweifle, dass würde allerdings so performant als IHttpModule sein.

Wenn Sie versuchen, das analysieren ~ / aus jeder Datei, einschließlich Textdateien, Javascript, etc, können Sie einen Handler schreiben, die einen Filter, um es zuordnet und Sie können das verwenden, um die Suche nach diesen Pfaden ... zum Beispiel ...

public class StringParsingFilter : MemoryStream {

    public Stream OriginalStream {
        get { return this.m_OriginalStream; }
        set { this.m_OriginalStream = value; }
    }
    private System.IO.Stream m_OriginalStream;

    public StringParsingFilter() : base() {
        this.m_OriginalStream = null;
    }

    public override void Flush() {
        this.m_OriginalStream.Flush();
    }

    public override void Write(byte[] buffer, int offset, int count) {

        //otherwise, parse for the correct content
        string value = System.Text.Encoding.Default.GetString(buffer);
        string contentType = HttpContext.Current.Response.ContentType;

        //Do any parsing here
        ...

        //write the new bytes to the stream
        byte[] bytes = System.Text.Encoding.Default.GetBytes(value);
        this.m_OriginalStream.Write(bytes, offset, count + (bytes.Length - buffer.Length));

    }

}

Und Sie werden einen benutzerdefinierten Handler zu wissen, schreiben, wenn Sie diesen Filter zuweisen ... wie folgt ...

 public class FilterControlModule : IHttpModule {

    public void Init(HttpApplication context) {
        HttpApplication oAppContext = context;
        oAppContext.BeginRequest += new EventHandler(_HandleSettingFilter);                        
    }

    private void _HandleSettingFilter(object sender, EventArgs e) {

        //You might check the file at this part to make sure
        //it is a file type you want to parse
        //if (!CurrentFile.isStyleSheet()) { return; }
        ...

        //assign the new filter
        StringParsingFilter filter = new StringParsingFilter();
        filter.OriginalStream = HttpContext.Current.Response.Filter;
        HttpContext.Current.Response.Filter = (Stream)filter;

    }

}

Es kann eigentlich schon einfacher, nur „IHttpModules nachschlagen“ zu sagen, aber das ist ein Code, die ich verwendet habe, Dateien für Pfade zu analysieren andere als ASP.net Dateien.

Sie müssen auch einige Dinge in Ihrem IIS-Einstellungen ändern sich die Dateien zu ermöglichen, indem die ASP.net ISAPI zu sein, um einen Platzhalter für alle Dateien analysiert werden, die behandelt bekommen. Sie können mehr

könnten Sie verwenden eine URL Rewriter die URL zu beheben, wie die Anfrage kommt, obwohl ich ist nicht so sicher, dass es so viel elegant wie ein Hack in diesem Fall ist.

Ich habe eine PathHelper util Klasse, die mir alle Wege gibt, gebe ich brauche. Zum Beispiel

<link href="<%=PathHelper.CssUrl("FormulaIndex.css")%>" rel="Stylesheet" type="text/css"/>

Gibt mir die korrekte vollständige URL mit Hilfe von System.Web.VirtualPathUtility.ToAbsolute () und meiner eigenen Konvention (content / css / yourFile.css).

habe ich das gleiche für js, xml, t9n, Bilder ... Sein zentraler, wiederverwendbar und jetzt hatte ich nur eine Zeile zu ändern, um die Bewegung der Scripts-Ordner von Inhalt / js zu Scripts in all meinen Websites und Seiten zu fangen.

A moronic bewegen, wenn Sie mich fragen, aber es ist die Realität in der aktuellen Beta: (

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top