Несколько идей:
- Использовать UserControl.LoadControl () с временными файлами
- Использовать UserControl.LoadControl () с HttpHandler
- Использовать BuildManager.CreateInstanceFromVirtualPath () со всеми страницами (вместо элементов управления)
Вариант 1: временные файлы (самый простой)
- Создайте каталог для вашего веб-приложения, например, для записи.
~/tmp/
(и дать веб-приложению изменить & создать разрешения для этого каталога)
Сохраните содержимое UserControl во временный файл:
string userControlContents = /* get user control contents from database */;
string path = Server.MapPath("~/tmp/2011081612332423.ascx");
System.IO.File.WriteAllText(path, userControlContents);
Загрузить пользовательский элемент управления:
Control c = UserControl.LoadControl("~/tmp/2011081612332423.ascx")
Добавить пользовательский элемент управления на нужную страницу:
this.Controls.Add(c);
Вариант 2: HttpHandler
- Реализация страницы или HttpHandler, который получает содержимое UserControl по идентификатору и выводит необработанное содержимое из базы данных в поток
Response
- Это может не работать , поскольку UserControl.LoadControl (), вероятно, не заботится о потоке ответа.
Затем загрузить элемент управления, как в Опция 1 :
Control c = UserControl.LoadControl("~/UserControlFromDB.ascx?id=392")
- Кэширование ASP.NET JIT может прерваться, поскольку имя файла «UserControlFromDB.ascx» всегда одинаково (изменяется только
id=NNN
). Перезапись URL может обойти это.
Вариант 3: Компиляция страниц вместо просто элементов управления :
BuildManager.CreateInstanceFromVirtualPath()
компилирует Page
в ASP.NET из виртуального пути. Таким образом, вы можете хранить целую страницу в базе данных и динамически ее компилировать.
Отказ от ответственности: Я не рекомендую хранить элементы управления или страницы в базе данных; это увеличит затраты на обслуживание, отладку и безопасность.