Могу ли я загрузить ITemplate из базы данных или строки?
-
28-10-2019 - |
Вопрос
Я собираюсь реализовать некоторые шаблоны в веб-приложении и хочу использовать шаблонные элементы управления ASP.NET.Однако я не хочу полагаться на физические файлы .ascx или VirtualPathProvider для загрузки шаблонов.
Я хочу иметь возможность загружать шаблоны из базы данных или другого хранилища данных (в памяти?). Существует ли какая-либо реализация метода LoadTemplate (), который возвращает ITemplate с учетом строкового представления шаблона .ascx?
Если нет, как бы мне написать его?
К вашему сведению, у Kentico есть аналогичная функция, но они полагаются на код VirtualPathProvider
, чтобы использовать код LoadTemplate()
в классе TemplateControl
.С помощью этого метода они могут загружать шаблоны (они называют их преобразованиями), хранящиеся в базе данных.
Решение
Да, вероятно, вы захотите использовать метод VirtualPathProvider
, если источником, который вы хотите использовать, является строка или база данных.(Существуют также генераторы кода, которые могут генерировать код, но обычно они используются при динамическом построении кода, а не при загрузке из внешнего источника, как в вашем случае.)
Вы не упоминаете, почему не хотите использовать VirtualPathProvider.Это связано с нежеланием или невозможностью из-за каких-то особых требований в конкретной ситуации?
Наконец, если "кажется тривиальным" загружать и компилировать код динамически, тогда вы не знаете, что должна делать вся система .Net, прежде чем она сможет запускать динамический код - генерация сборки, компиляция и JIT, приложениеконтексты, разрешение имен классов / членов, безопасность кода и т. д. Возможно, вы просто избалованы тем, насколько легко .Net упростила выполнение других сложных задач.;-)
Другие советы
Я столкнулся с аналогичной проблемой.Однако VirtualPathProvider просто слишком сложен для реализации для такого небольшого выигрыша - не говоря уже о том, что его реализация может быть немного рискованной с точки зрения безопасности.Я нашел два возможных решения:
1) Используйте отражение, чтобы получить то, что вы хотите:
родовое слово2) Используйте несколько хитроумный обходной путь:
родовое словоЯ открыто админку, что ни то ни другое не является отличным решением.В идеале в .Net Framework должен быть метод для такого рода вещей.Что-то вроде:
родовое словоЭто избавило бы от необходимости внедрять VirtualPathProvider.Может, мы увидим это в ASP.NET vNext :-)