我可以将Web UserControl ascx和代码存储在数据库中并从那里加载吗?

时间:2011-08-16 06:10:01

标签: .net asp.net web-user-controls

有没有什么方法可以将UserControl的代码存储在数据库表中,动态编译或从那里加载?意味着我从数据库中获取一个字符串,其中包含完整的UserControl代码,然后将其添加到页面中?

1 个答案:

答案 0 :(得分:1)

一些想法:

  1. UserControl.LoadControl()与临时文件一起使用
  2. 将UserControl.LoadControl()与HttpHandler一起使用
  3. BuildManager.CreateInstanceFromVirtualPath()与整个页面(而非控件)一起使用
  4. 选项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);
      
    5. 选项2:HttpHandler

      1. 实现一个页面或HttpHandler,它通过id获取UserControl内容,并将原始内容从数据库输出到Response
        • 这可能不起作用,因为UserControl.LoadControl()可能不关心响应流。
      2. 然后按选项1

        中的方式加载控件
        Control c = UserControl.LoadControl("~/UserControlFromDB.ascx?id=392")
        
        • ASP.NET JIT缓存可能会中断,因为文件名“UserControlFromDB.ascx”始终相同(仅id=NNN更改)。 URL重写可能会解决此问题。
      3. 选项3:编译页面而不仅仅是控件

        BuildManager.CreateInstanceFromVirtualPath()从虚拟路径编译ASP.NET中的Page。因此,您可以将整个页面存储在数据库中并动态编译。


        免责声明:我不建议在数据库中存储控件或页面;它会增加维护,调试和安全成本。