2010-10-15 23 views
6

¿Cómo puedo cargar un recurso incrustado como ITemplate? El método LoadTemplate() solo toma una ruta virtual de cadena, y obviamente esto no funcionará para los recursos integrados.Cargar plantilla del recurso incrustado

+0

Podría explicar donde 'ITemplate' proviene de? – JaredPar

+0

@JaredPar, asp.net - Modifiqué para incluir la etiqueta. –

+0

Cada archivo tiene una ruta. ¿Estás tratando de acceder a un archivo dentro de una DLL? – BrunoLM

Respuesta

2

Suponiendo que sus plantillas están incrustadas y deben permanecer así (lo cual creo que es posible que desee reconsiderar), aquí hay una función que escribí hace tiempo que he utilizado con éxito muchas veces al tratar con archivos incrustados (en su mayoría archivos .sql). Convierte un recurso incrustado en una cadena. Es posible que deba escribir su plantilla en el disco.

public static string GetEmbeddedResourceText(string resourceName, Assembly resourceAssembly) 
{ 
    using (Stream stream = resourceAssembly.GetManifestResourceStream(resourceName)) 
    { 
     int streamLength = (int)stream.Length; 
     byte[] data = new byte[streamLength]; 
     stream.Read(data, 0, streamLength); 

     // lets remove the UTF8 file header if there is one: 
     if ((data[0] == 0xEF) && (data[1] == 0xBB) && (data[2] == 0xBF)) 
     { 
     byte[] scrubbedData = new byte[data.Length - 3]; 
     Array.Copy(data, 3, scrubbedData, 0, scrubbedData.Length); 
     data = scrubbedData; 
     } 

     return System.Text.Encoding.UTF8.GetString(data); 
    } 
} 

Ejemplo de uso:

var text = GetEmbeddedResourceText("Namespace.ResourceFileName.txt", 
            Assembly.GetExecutingAssembly()); 
+0

Quería que la plantilla se incrustara, ya que se usa como la plantilla predeterminada para un control y es parte de un estilo específico. – MadSkunk

0

Su control debe parecer que:

public class Con : Control 
{ 
    public Template Content { get; set; } 

    protected override void CreateChildControls() 
    { 
     base.CreateChildControls(); 

     Content = new Template(); 

     // load controls from file and add to this control 
     Content.InstantiateIn(this); 
    } 

    public class Template : ITemplate 
    { 
     public void InstantiateIn(Control container) 
     { 
      // load controls 
      container.Controls.Add((HttpContext.Current.Handler as Page).LoadControl("Emb.ascx")); 
     } 
    } 
} 

A continuación, el archivo incrustado:

<%@ Control Language="C#" %> 

<asp:TextBox ID="Tb" runat="server" /> 

A continuación, cuando se utiliza el control se carga el recurso incrustado, por lo que usar:

<%@ Register Assembly="TestWeb" Namespace="TestWeb" TagPrefix="c" %> 
<c:Con runat="server" /> 

Creará un TextBox.


Si está intentando acceder a un archivo dentro de una DLL, see this implementation of VirtualPathProvider.

Cuestiones relacionadas