Могу ли я сохранить ascx и код Web UserControl в базе данных и загрузить его оттуда? - PullRequest
2 голосов
/ 16 августа 2011

Можно ли как-нибудь сохранить код UserControl в таблице базы данных, скомпилировать его динамически или загрузить из него?Означает ли я получить строку из базы данных, которая содержит полный код UserControl, а затем добавить ее на страницу?

1 Ответ

1 голос
/ 16 августа 2011

Несколько идей:

  1. Использовать UserControl.LoadControl () с временными файлами
  2. Использовать UserControl.LoadControl () с HttpHandler
  3. Использовать BuildManager.CreateInstanceFromVirtualPath () со всеми страницами (вместо элементов управления)

Вариант 1: временные файлы (самый простой)

  1. Создайте каталог для вашего веб-приложения, например, для записи. ~/tmp/ (и дать веб-приложению изменить & создать разрешения для этого каталога)
  2. Сохраните содержимое UserControl во временный файл:

    string userControlContents = /* get user control contents from database */;
    string path = Server.MapPath("~/tmp/2011081612332423.ascx");
    System.IO.File.WriteAllText(path, userControlContents);
    
  3. Загрузить пользовательский элемент управления:

    Control c = UserControl.LoadControl("~/tmp/2011081612332423.ascx")
    
  4. Добавить пользовательский элемент управления на нужную страницу:

    this.Controls.Add(c);
    

Вариант 2: HttpHandler

  1. Реализация страницы или HttpHandler, который получает содержимое UserControl по идентификатору и выводит необработанное содержимое из базы данных в поток Response
    • Это может не работать , поскольку UserControl.LoadControl (), вероятно, не заботится о потоке ответа.
  2. Затем загрузить элемент управления, как в Опция 1 :

    Control c = UserControl.LoadControl("~/UserControlFromDB.ascx?id=392")
    
    • Кэширование ASP.NET JIT может прерваться, поскольку имя файла «UserControlFromDB.ascx» всегда одинаково (изменяется только id=NNN). Перезапись URL может обойти это.

Вариант 3: Компиляция страниц вместо просто элементов управления :

BuildManager.CreateInstanceFromVirtualPath() компилирует Page в ASP.NET из виртуального пути. Таким образом, вы можете хранить целую страницу в базе данных и динамически ее компилировать.


Отказ от ответственности: Я не рекомендую хранить элементы управления или страницы в базе данных; это увеличит затраты на обслуживание, отладку и безопасность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...