UserControl のコードをデータベース テーブルに保存したり、動的にコンパイルしたり、そこからロードしたりする方法はありますか? UserControl の完全なコードを含む文字列をデータベースから取得し、それをページに追加するということですか?
1 に答える
2
いくつかのアイデア:
- 一時ファイルでUserControl.LoadControl()を使用する
- HttpHandler で UserControl.LoadControl() を使用する
- (コントロールではなく) ページ全体でBuildManager.CreateInstanceFromVirtualPath()を使用する
オプション 1: 一時ファイル (最も簡単)
- たとえば、Webアプリケーションが書き込むディレクトリを作成します
~/tmp/
(そして、Webアプリケーションにそのディレクトリへの変更と作成の権限を与えます) 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
- ID で UserControl コンテンツを取得し、データベースから
Response
ストリーム に生のコンテンツを出力するページまたは HttpHandler を実装します。- UserControl.LoadControl() はおそらく Response ストリームを気にしないため、これは機能しない可能性があります。
次に、オプション 1のようにコントロールをロードします。
Control c = UserControl.LoadControl("~/UserControlFromDB.ascx?id=392")
- ファイル名 "UserControlFromDB.ascx" は常に同じ (
id=NNN
変更のみ) であるため、ASP.NET JIT キャッシュが壊れる可能性があります。URL の書き換えにより、これを回避できる可能性があります。
- ファイル名 "UserControlFromDB.ascx" は常に同じ (
オプション 3:コントロールだけでなくページをコンパイルする:
BuildManager.CreateInstanceFromVirtualPath()
Page
仮想パスから ASP.NET で をコンパイルします。したがって、ページ全体をデータベースに保存し、動的にコンパイルできます。
免責事項:コントロールやページをデータベースに保存することはお勧めしません。メンテナンス、デバッグ、およびセキュリティのコストが増加します。
于 2011-08-16T08:03:07.657 に答える