2010-10-15 9 views
6

Wie kann ich eine eingebettete Ressource als ITemplate laden? Die LoadTemplate() -Methode verwendet nur einen virtuellen String-Pfad, und offensichtlich funktioniert dies nicht für eingebettete Ressourcen.Vorlage von eingebetteter Ressource laden

+0

Könnten Sie erklären, wo 'ITemplate' herkommt? – JaredPar

+0

@ JaredPar, asp.net - Ich habe das Tag geändert. –

+0

Jede Datei hat einen Pfad. Versuchen Sie, auf eine Datei in einer DLL zuzugreifen? – BrunoLM

Antwort

2

Angenommen, Ihre Vorlagen sind eingebettet und müssen so bleiben (was Sie vielleicht noch einmal überdenken möchten), hier ist eine Funktion, die ich vor einiger Zeit geschrieben habe und die ich oft mit eingebetteten Dateien verwendet habe (meist .sql Dateien). Es konvertiert eine eingebettete Ressource in eine Zeichenfolge. Sie müssen dann Ihre Vorlage auf die Festplatte schreiben.

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

Beispiel Nutzung:

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

Ich wollte, dass die Vorlage eingebettet wird, da sie als Standardvorlage für ein Steuerelement verwendet wird und Teil eines bestimmten Stils ist. – MadSkunk

0

Ihre Kontrolle sollte wie es aussehen:

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

Dann wird die eingebettete Datei:

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

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

Dann, wenn die Steuerung verwendet, wird es die eingebettete Ressource laden, so verwenden:

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

Wird eine TextBox erstellen.


Wenn Sie versuchen, eine Datei in einem DLL zuzugreifen, see this implementation of VirtualPathProvider.