2010-05-31 17 views
23

Desidero aggiungere programmaticamente gli StyleSheets nella sezione head, ma uno degli esempi che ho visto sembrava necessitare di molte righe di codice per aggiungere un solo foglio di stile anche se potrei aver bisogno di molto:Aggiunta di fogli di stile a livello di codice in Asp.Net

Esempio di codice:

HtmlLink css = new HtmlLink(); 
css.Href = "css/fancyforms.css"; 
css.Attributes["rel"] = "stylesheet"; 
css.Attributes["type"] = "text/css"; 
css.Attributes["media"] = "all"; 
Page.Header.Controls.Add(css); 

ho anche utilizzare Page.Header.RenderControl() metodo, ma non ha funzionato neanche. Oggetto null è stato generato un errore.

Ho utilizzato anche Page.Header.InnerHtml e InnerText += "<link .... "/> ma hanno gettato l'errore letterale che credo sia un errore comune.

Ho usato questo codice:

List<Literal> cssFiles = new List<Literal>(); 
cssFiles.Add(new Literal() { Text = @"<link href=""" + ResolveUrl("~/Resources/Styles/MainMaster/MainDesign.css") + @""" type=""text/css"" rel=""stylesheet"" />" }); 
cssFiles.Add(new Literal() { Text = @"<link href=""" + ResolveUrl("~/Resources/Styles/MainMaster/MainLayout.css") + @""" type=""text/css"" rel=""stylesheet"" />" }); 
AddStyleRange(cssFiles); 

private void AddStyleRange(List<Literal> cssFiles) 
{ 
    foreach (Literal item in cssFiles) 
    { 
    this.Header.Controls.Add(item); 
    } 
} 

ha funzionato in un primo momento, ma quando cambio le pagine che ha smesso di funzionare.

Sto usando pagina master e sto scrivendo questi codici su Master.cs di file e anche alcune persone consiglia di utilizzare this.Header invece di Page.Header ma quando ho costruito getta un errore che dice che non posso dichiarare che in questo modo.

Non dovrebbe essere così difficile aggiungere molti stili.

È complicato.

risposta

42

Va bene, ecco la soluzione Attualmente sto usando:

ho creato una classe di supporto:

using System.Web.UI; 
using System.Web.UI.WebControls; 

namespace BusinessLogic.Helper 
{ 
    public class CssAdder 
    { 
     public static void AddCss(string path, Page page) 
     { 
      Literal cssFile = new Literal() { Text = @"<link href=""" + page.ResolveUrl(path) + @""" type=""text/css"" rel=""stylesheet"" />" }; 
      page.Header.Controls.Add(cssFile); 
     } 
    } 
} 

e poi attraverso questa classe di supporto, tutto quello che devo fare è:

CssAdder.AddCss("~/Resources/Styles/MainMaster/MainDesign.css", this.Page); 
CssAdder.AddCss("~/Resources/Styles/MainMaster/MainLayout.css", this.Page); 
CssAdder.AddCss("~/Resources/Styles/Controls/RightMainMenu.css", this.Page); 
//... 

Quindi posso aggiungere quanto voglio con una riga di codice semplice.

Funziona anche con le relazioni della pagina principale e della pagina di contenuto.

Spero che aiuti.

P.S: Non conosco la differenza di prestazioni tra questa e altre soluzioni ma sembra più elegante e facile da consumare. Se conosci modi migliori, per favore fammi sapere. Grazie ...

+0

Ho trovato un trucco: assicurati che il tuo tag abbia runat = "server" o che il codice non lo trovi. – SteveCav

4

Io incollo la cosa che ha funzionato per me:

HtmlLink link = new HtmlLink(); 
//Add appropriate attributes 
link.Attributes.Add("rel", "stylesheet"); 
link.Attributes.Add("type", "text/css"); 
link.Href = "/Resources/CSS/NewStyles.css"; 
link.Attributes.Add("media", "screen, projection"); 
//add it to page head section 
this.Page.Header.Controls.Add(link); 

Anche ho cercato molto su questo, mi piacerebbe aggiungere un foglio di stile imperativa quando un pulsante viene premuto. Ho usato il codice sopra e ha funzionato perfettamente per me.

+0

E BTW, io uso una pagina master, e il pulsante era nel piè di pagina; così come il codice incollato. – Kay

+0

Grazie, ma questo è quello che stavo citando sopra, quindi non voglio questa soluzione. In realtà ho trovato la soluzione :) – Tarik

+0

Questo è fantastico! Puoi farmi sapere la soluzione che hai capito? – Kay

2

Sono andato un passaggio, volevo un metodo che mi rende impossibile aggiungere include duplicati, qualcosa come ClientScriptManager.RegisterClientScriptInclude(). La soluzione è di fornire un ID al controllo aggiunto nella sezione Intestazione.

if (!String.IsNullOrEmpty(Key)) 
    if (Page.Header.FindControl(Key) != null) return; 

HtmlLink link = new HtmlLink(); 
if (!String.IsNullOrEmpty(Key)) link.ID = Key; 
link.Href = StyleUrl; 
link.Attributes.Add("type", "text/css"); 
link.Attributes.Add("rel", "stylesheet"); 
Page.Header.Controls.Add(link); 

Per l'articolo completo che ho scritto: http://www.idea-r.it/Blog.aspx?Article=49

3

mi definiscono un generico HTML <link> e impostare l'attributo href di programmazione.

Ad esempio, nella pagina <head> ho:

<link id="cssStyle" runat="server" rel="stylesheet" type="text/css" />. 

Poi nel Page_Load impostare la proprietà HREF cssStyle:

cssStyle.Href = "path/to/Styles.css"; 

sembra un po 'più pulito con il vantaggio di avere il controllo della progettazione posizionando il numero <link> nell'ordine desiderato.

Problemi correlati