Загрузить шаблон из встроенного ресурса - PullRequest
6 голосов
/ 16 октября 2010

Как я могу загрузить встроенный ресурс в качестве ITemplate? Метод LoadTemplate () принимает только строковый виртуальный путь, и, очевидно, это не будет работать для встроенных ресурсов.

Ответы [ 2 ]

2 голосов
/ 16 октября 2010

Предполагая, что ваши шаблоны встроены и должны оставаться такими (что, я думаю, вы, возможно, захотите пересмотреть), вот функция, которую я написал некоторое время назад, которую я успешно использовал много раз при работе со встроенными файлами (главным образомфайлы .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());
0 голосов
/ 16 октября 2010

Ваш элемент управления должен выглядеть следующим образом:

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" />

Создает TextBox.


Если вы пытаетесь получить доступ к файлу внутри DLL, см. Эту реализацию VirtualPathProvider .

...