Compile aspx page "on the fly"
我正在尝试在运行时构建一个 aspx 页面(由另一个最终重定向到新页面的 aspx 页面)。据我了解,aspx 页面必须在用户查看它们之前进行预编译。也就是说,aspx页面必须编译成/bin文件夹下的DLL。
在我将用户重定向到页面之前,是否可以告诉 IIS,或者通过 VB.NET 代码对其进行排序,以编译页面?
任何帮助将不胜感激。
您可以使用 VirtualPathProvider 类从数据库加载页面。
基本上您需要的是动态呈现页面内容。您可以通过将控件(HTML 或 Server Ones)添加到控件集合(例如占位符服务器元素)在服务器端动态创建页面内容。
例如,您可以使用以下标记创建页面:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="TestPage.aspx.cs" Inherits="StackOverflowWebApp.TestPage" %> <!DOCTYPE html PUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> </head> <body> <form id="form1" runat="server"> </asp:PlaceHolder> </form> </body> </html> |
然后在类后面的代码中,我们可以添加控件来渲染,这是动态读取数据库信息所必需的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; namespace StackOverflowWebApp { public partial class TestPage : Page { #region Methods protected override void CreateChildControls() { base.CreateChildControls(); // HERE get configuration from database. // HERE create content of the page dynamically. // Add reference to css file. HtmlLink link = new HtmlLink { href="~/Styles/styles.css" }; link.Attributes.Add("type","text/css"); link.Attributes.Add("rel","stylesheet"); this.Page.Header.Controls.Add(link); // Add inline styles. HtmlGenericControl inlineStyle = new HtmlGenericControl("style"); inlineStyle.InnerText ="hr {color:sienna;} p {margin-left:20px;}"; this.Page.Header.Controls.Add(inlineStyle); // Add div with css class and styles. HtmlGenericControl div = new HtmlGenericControl("div"); this.ContentPlaceHolder.Controls.Add(div); div.Attributes.Add("class","SomeCssClassName"); div.Attributes.CssStyle.Add(HtmlTextWriterStyle.ZIndex,"1000"); TextBox textBox = new TextBox { ID ="TestTextBox" }; div.Controls.Add(textBox); // and etc } #endregion } } |
注意:此示例可以作为创建动态页面的起点,其内容取决于数据库或配置中指定的值。