2011-08-16 33 views
2

有什麼辦法可以將UserControl的代碼存儲在數據庫表中,動態編譯它或從那裏加載它?意味着我從包含UserControl的完整代碼的數據庫中獲取字符串,然後將其添加到頁面中?我可以將Web UserControl ascx和代碼存儲在數據庫中並從那裏加載它嗎?

+1

我的大腦正在融化:) – 2011-08-16 06:17:23

+0

@pst爲什麼?我目前正在使用Sharepoint,並且它也從數據庫中提取所有代碼。所以,它肯定有可能。 – teenup

+0

它從數據庫加載用戶控件...?我確定他們在ControlTemplates中... – 2011-08-16 06:25:09

回答

1

幾個想法:

  1. 使用UserControl.LoadControl()與臨時文件
  2. 使用UserControl.LoadControl()的HttpHandler的
  3. 使用BuildManager.CreateInstanceFromVirtualPath()的是整個網頁(而非控制)

選項1:臨時文件(最簡單)

  1. 創建一個供您的Web應用程序寫入的目錄,例如~/tmp/(並給Web應用程序修改 & 創建權限對該目錄)
  2. 保存用戶控件的內容到一個臨時文件:

    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. 實現一個頁面或HttpHandler的由ID獲取該用戶控件內容,並從數據庫中的原始內容輸出到Response
    • 這可能不起作用因爲UserControl.LoadControl()可能不關心響應流。
  2. 然後加載控制在選項1:因爲文件名

    Control c = UserControl.LoadControl("~/UserControlFromDB.ascx?id=392") 
    
    • ASP.NET緩存JIT可能爆發 「UserControlFromDB.ascx」 始終是相同的(僅id=NNN變化)。 URL重寫可能會解決這個問題。

方案3:編譯,而不是僅僅控制網頁:

BuildManager.CreateInstanceFromVirtualPath()從虛擬路徑編譯在ASP.NET一個Page。因此,您可以將整個頁面存儲在數據庫中並動態編譯它。


免責聲明:我不建議存儲控制器或數據庫中的網頁;它會增加維護,調試和安全成本。

相關問題