2010-10-15 19 views
6

Gömülü bir kaynağı nasıl bir ITemplate olarak yükleyebilirim? LoadTemplate() yöntemi sadece bir dize sanal yol alır ve açıkçası bu gömülü kaynaklar için çalışmayacaktır.Şablonu gömülü kaynağından yükleme

+0

açıklayabilir misiniz? – JaredPar

+0

@JaredPar, asp.net - Etiketi eklemek için değiştirdim. –

+0

Her dosyanın bir yolu vardır. Bir DLL dosyasındaki bir dosyaya erişmeye mi çalışıyorsunuz? – BrunoLM

cevap

2

Şablonlarınızın gömülü olduğunu ve bu şekilde kalması gerektiğini düşünürsek (ki bunu yeniden düşünmek isteyebilirsiniz), gömülü dosyalarla uğraşırken birçok kez başarılı bir şekilde kullandığım bir işlev yazdım. çoğunlukla .sql dosyaları). Gömülü bir kaynağı bir dizeye dönüştürür. Sonra şablonunuzu diske yazmanız gerekebilir.

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

Örnek kullanım: `ITemplate` nereden geldiğini

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

Şablonun, bir denetim için varsayılan şablon olarak kullanıldığı ve belirli bir stilin parçası olduğu için gömülmesini istedim. – MadSkunk

0

Denetiminizin bunun gibi görünmelidir:

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

Sonra gömülü dosyası: kontrolü kullanarak Sonra

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

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

gömülü kaynak yükleyecek ve böylece kullanarak:

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

Bir TextBox oluşturur.


Eğer see this implementation of VirtualPathProvider bir DLL içinde bir dosyaya erişmek için çalışıyorsanız.