Define Label and Button Control on each page of the web project

I try again to contact asp.net experts and hope to get an answer. I really got stuck here and asked for help. I hope my question does not go down, and I could get an answer solely from a technical point of view, instead of just condemning my approach.

Earlier I asked the question as follows: asp.net convert asp.net page to page variable

Then I looked at the next page, but still did not work for me.

Download an aspx 2.0 aspx page using System.Reflection?

Inside my web application, I would like to be able to link to web pages somewhere in my code, such as "WebForm1.aspx", and get a list of the controls on this page. Please just look at it from this point of view, and not at its analysis. Is it possible?

In my p page variable I don't have controls for WebForm1.aspx

Here is my code.

Please, help.

protected void Page_Load(object sender, EventArgs e) { string[] filePaths = Directory.GetFiles(Server.MapPath("~/"), "*.*", SearchOption.AllDirectories); foreach (string filepath in filePaths) { if (filepath.EndsWith(".aspx")) { Response.Write(filepath + "<br/>"); string[] folders = filepath.Split('\\'); string filename = folders[folders.Count() - 1]; string fullpath = "~/" + filename; Page p = BuildManager.CreateInstanceFromVirtualPath("~/"+fullpath, typeof(Page)) as Page; List<String> controlList = new List<String>(); ResourceManager.AddControls(p.Controls, controlList); foreach (string str in controlList) { Response.Write(str + "<br/>"); } } } 
+7
source share
2 answers

Because of the life cycle of an ASP.NET page, controls are only created by processing the request ( IHttpHandler.ProcessRequest(HttpContext) ).

Before iterating through the controls, you need to execute the following code:

 //this is necessary, Otherwise "Default.aspx" will show the contents of "WebForm1.aspx". HttpWorkerRequest hwr = new SimpleWorkerRequest(this.TxtPageVirtualPath.Text, "", tw); HttpContext fakeContext = new HttpContext(hwr); ((IHttpHandler)p).ProcessRequest(fakeContext); 

Below is the full code for Default.aspx:

 using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Web.Compilation; using System.Collections.Generic; using System.Resources; using System.IO; using System.Web.Hosting; namespace _1423280WebApp { public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void BtnLoad_Click(object sender, EventArgs e) { Page p = BuildManager.CreateInstanceFromVirtualPath(this.TxtPageVirtualPath.Text, typeof(Page)) as Page; List<String> controlList = new List<String>(); MemoryStream ms = new MemoryStream(); TextWriter tw = new StreamWriter(ms); HtmlTextWriter htw = new HtmlTextWriter(tw); //this is necessary, Otherwise "Default.aspx" will show the contents of "WebForm1.aspx". HttpWorkerRequest hwr = new SimpleWorkerRequest(this.TxtPageVirtualPath.Text, "", tw); HttpContext fakeContext = new HttpContext(hwr); ((IHttpHandler)p).ProcessRequest(fakeContext); //I could not compile this part in VS2005 //ResourceManager.AddControls(p.Controls, controlList); this.TxtListControls.Text = ""; foreach (Control ctr in p.Controls) { this.TxtListControls.Text += this.recursiveControls(p, ""); } } public string recursiveControls(Control control, string ident) { string retStr = String.Format( ident + "D='{0}', ClientID='{1}', Type=='{2}' \n", control.ID, control.ClientID, control.GetType().FullName); foreach (Control innerCtr in control.Controls) { retStr += this.recursiveControls(innerCtr, " " + ident); } return retStr; } } } 
 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="_1423280WebApp._Default" %> <!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"> <title>Untitled Page</title> </head> <body> <form id="form1" runat="server"> <div> Get List of Controls from:<br /> <asp:TextBox ID="TxtPageVirtualPath" runat="server">~/webform1.aspx</asp:TextBox><br /> <asp:Button ID="BtnLoad" runat="server" OnClick="BtnLoad_Click" Text="Load" /><br /> Controls:<br /> <asp:TextBox ID="TxtListControls" runat="server" Height="328px" TextMode="MultiLine" Width="100%"></asp:TextBox></div> </form> </body> </html> 

Solution with full code example: q_11423280WebApp.7z

+4
source

Here's an alternative to loading controls:

 protected void Page_Load(object sender, EventArgs e) { Type type = BuildManager.GetCompiledType("~/Default.aspx"); var page = (Default)Activator.CreateInstance(type); ((IHttpHandler)page).ProcessRequest(HttpContext.Current); var count = page.Controls.Count; Response.Clear(); // Because we use HttpContext.Current the response has a lot of stuff } 
+2
source

All Articles