Pregunta

¿Cómo puedo cargar un recurso incrustado como un ITemplate? El método LoadTemplate () sólo toma un camino virtual de cuerdas, y, obviamente, esto no funcionará para los recursos incrustados.

¿Fue útil?

Solución

Si se asume que las plantillas están incrustados y necesidad de permanecer de esa manera (que creo que es posible que desee volver a examinar), aquí es una función que escribí una vuelta, mientras que he utilizado con éxito muchas veces cuando se trata de archivos incrustados (en su mayoría archivos .sql). Convierte un recurso incrustado en una cadena. A continuación, puede que tenga que escribir su plantilla a 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());

Otros consejos

Su control debe parecerse a él:

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 de que se carga el recurso incrustado, así que usar:

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

Se creará un cuadro de texto.


Si está intentando acceder a un archivo dentro de una DLL, ver esta implementación de VirtualPathProvider .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top