2010-10-15 36 views
6

Làm cách nào để tải tài nguyên được nhúng dưới dạng bản đồ ITemplate? Phương thức LoadTemplate() chỉ nhận một đường dẫn ảo chuỗi, và rõ ràng điều này sẽ không hoạt động với các tài nguyên nhúng.Tải mẫu từ tài nguyên được nhúng

+0

Ông có thể giải thích nơi 'ITemplate' đến từ đâu? – JaredPar

+0

@JaredPar, asp.net - Tôi đã sửa đổi để bao gồm thẻ. –

+0

Mọi tệp đều có đường dẫn. Bạn đang cố truy cập một tệp bên trong một DLL? – BrunoLM

Trả lời

2

Giả sử rằng các mẫu của bạn được nhúng và cần phải theo cách đó (mà tôi nghĩ bạn có thể muốn xem xét lại), đây là một hàm tôi đã viết một thời gian trước. phần lớn tệp .sql). Nó chuyển đổi một tài nguyên nhúng thành một chuỗi. Sau đó bạn có thể cần phải viết mẫu của bạn ra đĩa.

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

sử dụng Ví dụ:

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

Tôi muốn mẫu được nhúng vì nó được sử dụng làm mẫu mặc định cho điều khiển và là một phần của một kiểu cụ thể. – MadSkunk

0

kiểm soát của bạn sẽ giống như nó:

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

Sau đó, các tập tin nhúng:

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

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

Sau đó, khi sử dụng điều khiển nó sẽ tải các tài nguyên nhúng, vì vậy sử dụng:

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

Sẽ tạo một TextBox.


Nếu bạn đang cố gắng truy cập tệp trong DLL, see this implementation of VirtualPathProvider.

Các vấn đề liên quan