データベースまたは文字列からITemplateをロードできますか?
-
28-10-2019 - |
質問
Webアプリケーションにいくつかのテンプレートを実装したいと考えており、ASP.NETのテンプレート化されたコントロールを利用したいと考えています。ただし、テンプレートをロードするために、物理的な.ascxファイルやVirtualPathProviderに依存したくありません。
データベースまたは他のデータストア(メモリ内?)からテンプレートをロードできるようにしたい。 .ascxテンプレートの文字列表現を指定してITemplateを返すLoadTemplate()メソッドの実装はありますか?
そうでない場合は、どのように作成しますか?
FYI、Kenticoにも同様の機能がありますが、VirtualPathProvider
クラスでLoadTemplate()
を使用するために、TemplateControl
に依存しています。この方法を使用すると、データベースに保存されているテンプレート(変換と呼ばれます)をロードできます。
解決
はい、文字列またはデータベースが使用したいソースである場合、VirtualPathProvider
はおそらく使用したい方法です。(コードを発行できるコードジェネレーターもありますが、通常、コードを動的にビルドするときに使用されます。あなたの場合のように外部ソースからロードするのではありません。)
ただし、VirtualPathProviderを使用したくない理由については言及していません。それは、特定の状況であなたが持っているいくつかの特別な要件のためにしたくない、またはできないためですか?
最後に、コードを動的にロードしてコンパイルするのが「簡単に思える」場合、動的コードを実行する前に.Netシステム全体が何をしなければならないかわかりません-アセンブリ生成、コンパイル、JIT、アプリケーションコンテキスト、クラス/メンバーの名前解決、コードのセキュリティなど。.Netが他の複雑なタスクを簡単に実行できることに甘んじているかもしれません。;-)
他のヒント
私も同様の問題に直面しています。ただし、VirtualPathProviderは、このような小さな利益を実現するには配管が多すぎるため、セキュリティ面で実装するのに少しリスクが伴う可能性があることは言うまでもありません。2つの可能な回避策を見つけました:
1)リフレクションを使用して目的を達成します: ジェネラコディセタグプレ
2)ややハッキーな回避策を使用します: ジェネラコディセタグプレ
私は公然と管理していますが、どちらも優れたソリューションではありません。理想的には、この種のことのためのメソッドが.NetFrameworkにあるでしょう。次のようなもの: ジェネラコディセタグプレ
これにより、VirtualPathProviderを実装する必要性全体が軽減されます。たぶん、ASP.NETvNextでそれを見るでしょう:-)