Domanda

Nel normale scenario WebForms, qualsiasi URL relativo alla radice (ad es. ~ / folder / file.txt) all'interno file CSS come:

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

verrà automaticamente risolto durante il runtime se specifico

<head runat="server">

Nella pagina di riferimento.

Tuttavia, ciò non accade più su un sito Web ASP.NET MVC Beta1.

Esiste un modo per abilitare questa funzionalità senza ricorrere a hack o file caricatore CSS? Come forse HttpModules o qualcosa del genere?

O non desoto il mio sito Web correttamente? Che cosa dovrebbe essere un buon design?

Poiché i WebForm ASP.NET originali dispongono già di questa funzione, preferirei utilizzare qualsiasi funzionalità esistente, se possibile. Ma non ne ho molti indizi.

Questa applicazione Web verrà distribuita in diversi ambienti in cui la cartella ~ root potrebbe non essere ovvia.


MODIFICA: intendo l'URL nel CONTENUTO del file, non l'URL del file stesso.

È stato utile?

Soluzione

Non mi preoccuperei del carattere ~ di ricerca automatica. Comprendo che si desidera che la stessa soluzione funzioni laddove la directory principale differisce tra le distribuzioni, ma all'interno del documento CSS non si dovrebbero riscontrare problemi nell'utilizzo dei percorsi relativi. I percorsi nel documento CSS (all'URL dell'immagine nel tuo esempio) saranno sempre relativi alla posizione del file CSS indipendentemente dal percorso di qualsiasi pagina che carica quel file CSS. Quindi se le tue immagini sono in ~ / Content / Images e i tuoi fogli di stile sono in ~ / Content / Stylesheets , sarai sempre in grado di usare background-image : url (../ Images / form_bg.gif); e funzionerà indipendentemente dalla posizione della pagina che carica il foglio di stile.

C'è un motivo per cui non funzionerebbe?

Altri suggerimenti

Un trucco che ho usato in passato è stato quello di rendere il mio file CSS con estensione .ASPX e impostare la proprietà ContentType nella firma della pagina:

<%@ 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;
}

Ciò garantirà che il file CSS passi attraverso il framework ASP.NET e sostituisca il codice lato server con il relativo percorso.

Qui are alcune risorse sull'implementazione di IHttpModule in intercettare le richieste web alla tua app ...

Scrivi / adatta uno per verificare il tipo di file (ad esempio pseudocodice: if (la richiesta termina con " .css ") ...)

quindi usa un'espressione regolare per sostituire tutte le istanze di " ~ / " con System.Web.VirtualPathUtility.ToAbsolute (" ~ / ")

Non so cosa questo farà per le prestazioni, eseguendo ogni richiesta attraverso questo tipo di filtro, ma probabilmente puoi giocherellare con il tuo file web.config e / o i tuoi percorsi URL MVC per incanalare tutte le richieste .css attraverso questo tipo di filtro mentre lo salta per altri file.

Vieni a pensarci bene, probabilmente puoi ottenere lo stesso effetto all'interno di un'app ASP.NET MVC puntando tutte le tue rifrazioni CSS su uno speciale controller.action che esegue questo tipo di preelaborazione per te. dubito che sarebbe comunque performante come un IHttpModule.

Se stai cercando di analizzare il ~ / da qualsiasi file, inclusi file di testo, javascript, ecc., puoi scrivere un gestore che gli assegni un filtro e puoi usarlo per cerca quei percorsi ... per esempio ...

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));

    }

}

E scriverai un gestore personalizzato per sapere quando assegnare questo filtro ... come il seguente ...

 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;

    }

}

In realtà potrebbe essere stato più semplice dire " cerca IHttpModules " ma questo è un codice che ho usato per analizzare i file per percorsi diversi dai file ASP.net.

Dovrai anche modificare alcune cose nelle impostazioni di IIS per consentire l'analisi dei file impostando l'ISAPI ASP.net come jolly per tutti i file che vengono gestiti. Puoi vedere di più su questo sito web , se stai utilizzando IIS6 che è ...

Puoi anche usarlo per modificare qualsiasi tipo di file in modo da poter assegnare alcuni filtri per immagini, alcuni per javascript o fogli di stile o ... davvero qualsiasi cosa ...

Potresti utilizzare un URL Rewriter per correggere l'URL quando arriva la richiesta, sebbene io non sono così sicuro che sia così elegante come un trucco in questo caso.

Ho creato una classe util PathHelper che mi dà tutti i percorsi di cui ho bisogno. Ad esempio

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

Mi dà l'URL completo corretto con l'aiuto di System.Web.VirtualPathUtility.ToAbsolute () e la mia convenzione (content / css / yourFile.css).

Ho fatto lo stesso per js, xml, t9n, pics ... È centrale, riutilizzabile e ora ho dovuto cambiare solo una riga per spostare la cartella degli script da content / js a Script in tutti i miei siti Web e pagine.

Una mossa idiota se me lo chiedi, ma è realtà nell'attuale beta :(

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top