2

UserControl のコードをデータベース テーブルに保存したり、動的にコンパイルしたり、そこからロードしたりする方法はありますか? UserControl の完全なコードを含む文字列をデータベースから取得し、それをページに追加するということですか?

4

1 に答える 1

2

いくつかのアイデア:

  1. 一時ファイルでUserControl.LoadControl()を使用する
  2. HttpHandler で UserControl.LoadControl() を使用する
  3. (コントロールではなく) ページ全体でBuildManager.CreateInstanceFromVirtualPath()を使用する

オプション 1: 一時ファイル (最も簡単)

  1. たとえば、Webアプリケーションが書き込むディレクトリを作成します~/tmp/(そして、Webアプリケーションにそのディレクトリへの変更作成の権限を与えます)
  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. ID で UserControl コンテンツを取得し、データベースからResponseストリーム に生のコンテンツを出力するページまたは HttpHandler を実装します。
    • UserControl.LoadControl() はおそらく Response ストリームを気にしないため、これは機能しない可能性があります。
  2. 次に、オプション 1のようにコントロールをロードします。

    Control c = UserControl.LoadControl("~/UserControlFromDB.ascx?id=392")
    
    • ファイル名 "UserControlFromDB.ascx" は常に同じ (id=NNN変更のみ) であるため、ASP.NET JIT キャッシュが壊れる可能性があります。URL の書き換えにより、これを回避できる可能性があります。

オプション 3:コントロールだけでなくページをコンパイルする:

BuildManager.CreateInstanceFromVirtualPath()Page仮想パスから ASP.NET で をコンパイルします。したがって、ページ全体をデータベースに保存し、動的にコンパイルできます。


免責事項:コントロールやページをデータベースに保存することはお勧めしません。メンテナンス、デバッグ、およびセキュリティのコストが増加します。

于 2011-08-16T08:03:07.657 に答える