有什么方法可以将 UserControl 的代码存储在数据库表中,动态编译或从那里加载?意味着我从数据库中获取包含 UserControl 完整代码的字符串,然后将其添加到页面中?
问问题
978 次
1 回答
2
一些想法:
- 将UserControl.LoadControl()与临时文件一起使用
- 将 UserControl.LoadControl() 与 HttpHandler 一起使用
- 对整个页面(而不是控件)使用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() 可能不关心响应流。
然后像选项 1一样加载控件:
Control c = UserControl.LoadControl("~/UserControlFromDB.ascx?id=392")
- ASP.NET JIT 缓存可能会中断,因为文件名“UserControlFromDB.ascx”始终相同(仅
id=NNN
更改)。URL 重写可能会解决这个问题。
- ASP.NET JIT 缓存可能会中断,因为文件名“UserControlFromDB.ascx”始终相同(仅
选项 3:编译页面而不仅仅是控件:
BuildManager.CreateInstanceFromVirtualPath()
Page
从虚拟路径编译ASP.NET。因此,您可以将整个页面存储在数据库中并动态编译它。
免责声明:我不建议在数据库中存储控件或页面;它将增加维护、调试和安全成本。
于 2011-08-16T08:03:07.657 回答