2010-05-31 12 views
23

Quiero agregar StyleSheets programáticamente en la sección de encabezado, pero uno de los ejemplos que vi parecía necesitar muchas líneas de código para agregar una sola hoja de estilos aunque pueda necesitar mucho:Agregar StyleSheets programáticamente en Asp.Net

Código Ejemplo:

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

también uso Page.Header.RenderControl() método, pero no funcionaba. Objeto nulo algo error fue lanzado.

También utilicé Page.Header.InnerHtml y InnerText += "<link .... "/> cosas pero arrojaron el error literal, que creo que es un error común.

que utiliza este código:

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

Se trabajó al principio, pero cuando cambio las páginas que dejó de funcionar.

estoy usando página maestra y le escribo estos códigos en Master.cs archivo y también algunas personas recomiendan usar en lugar de this.HeaderPage.Header pero cuando lo construí lanza un error que dice que no puedo declarar que de esta manera.

No debería ser tan difícil agregar muchos estilos.

Se está complicando.

Respuesta

42

bien, aquí es la solución que estoy usando actualmente:

he creado una clase de ayuda:

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

y luego a través de esta clase de ayuda, todo lo que tengo que hacer es:

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

Así que puedo agregar todo lo que quiera con una línea de código simple.

También funciona con relaciones de páginas maestras y páginas de contenido.

Espero que ayude.

P.S: No conozco la diferencia de rendimiento entre esta y otras soluciones, pero parece más elegante y fácil de consumir. Si conoce mejores formas, por favor hágamelo saber. Gracias ...

+0

Encontré una gotcha: asegúrate de que tu etiqueta tenga runat = "server" o el código no la encontrará. – SteveCav

4

Pegaré lo que funcionó para mí:

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

Incluso he buscado mucho en esto, me añadir una hoja de estilo predominante cuando se hace clic en un botón. Usé el código anterior y funcionó perfectamente para mí.

+0

Y por cierto, uso una página maestra, y el botón estaba en el pie de página; así como el código pegado. – Kay

+0

Gracias, pero esto es lo que mencioné anteriormente, así que no quiero esta solución. De hecho, he encontrado la solución :) – Tarik

+0

¡Eso es genial! ¿Me puedes decir la solución que descubriste? – Kay

2

Fui un paso más allá, quería un método que me hiciera imposible agregar incluir duplicados, algo así como ClientScriptManager.RegisterClientScriptInclude(). La solución es dar una identificación al control agregado en la sección Encabezado.

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

Para el artículo completo escribí: http://www.idea-r.it/Blog.aspx?Article=49

3

que definen un HTML genérico <link> y establezca el atributo href mediante programación.

Por ejemplo, en la página <head> que tengo:

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

Luego, en Load establezca la propiedad HREF cssStyle:

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

parece un poco más limpio, con la ventaja de tener el control del diseño sobre colocar el <link> en el orden deseado.

Cuestiones relacionadas