如何将嵌入式资源加载为 ITemplate?LoadTemplate() 方法只接受一个字符串虚拟路径,显然这不适用于嵌入式资源。
问问题
3148 次
2 回答
2
假设您的模板是嵌入的并且需要保持这种方式(我认为您可能需要重新考虑),这是我不久前编写的一个函数,在处理嵌入文件(主要是 .sql 文件)时我已经成功使用过很多次)。它将嵌入的资源转换为字符串。然后,您可能需要将模板写入磁盘。
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);
}
}
示例用法:
var text = GetEmbeddedResourceText("Namespace.ResourceFileName.txt",
Assembly.GetExecutingAssembly());
于 2010-10-15T23:34:48.463 回答
0
您的控件应如下所示:
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"));
}
}
}
然后嵌入文件:
<%@ Control Language="C#" %>
<asp:TextBox ID="Tb" runat="server" />
然后在使用控件时,它将加载嵌入的资源,因此使用:
<%@ Register Assembly="TestWeb" Namespace="TestWeb" TagPrefix="c" %>
<c:Con runat="server" />
将创建一个文本框。
如果您尝试访问 DLL 中的文件,请参阅 VirtualPathProvider 的此实现。
于 2010-10-15T23:31:49.223 回答