2012-07-10 16 views
7

Tôi đang cố gắng một lần nữa để tiếp cận với các chuyên gia asp.net và hy vọng nhận được câu trả lời. Tôi thực sự bị mắc kẹt ở đây và yêu cầu giúp đỡ. Hy vọng rằng, câu hỏi của tôi sẽ không bị bỏ phiếu, và tôi có thể nhận được câu trả lời hoàn toàn từ quan điểm kỹ thuật thay vì mọi người chỉ đơn giản là phán xét về cách tiếp cận của tôi.Xác định nhãn và nút điều khiển trong mỗi trang của dự án web

Trước đó tôi đăng câu hỏi như sau: asp.net convert asp.net page into Page variable

Sau đó, tôi nhìn vào trang sau nhưng nó vẫn không làm việc cho tôi.

Load an ASP.NET 2.0 aspx page using System.Reflection?

Bên trong ứng dụng web của tôi, tôi muốn để có thể tham khảo trang web bất kỳ nơi nào trên mã của tôi như "WebForm1.aspx" và nhận được một danh sách các nút điều khiển trên trang đó. Hãy nhìn vào nó từ quan điểm này và không phân tích nó. Có thể không?

Trong trang biến p của tôi, tôi dường như không có bất kỳ điều khiển cho WebForm1.aspx

Đây là mã của tôi.

Vui lòng trợ giúp.

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/>"); 
       } 


      } 
     } 
+0

ứng dụng trang web asp.net hoặc ứng dụng web? – Candide

+0

ứng dụng web .. cảm ơn –

+0

tôi nghĩ là một câu hỏi hay –

Trả lời

4

Do ASP.NET Page Life Cycle, các điều khiển chỉ được tạo ra bằng cách xử lý yêu cầu (IHttpHandler.ProcessRequest(HttpContext)).

Trước khi lặp qua các điều khiển bạn cần phải chạy vào mã bên dưới:

//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); 

Dưới đây là đoạn code đầy đủ cho 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> 

Giải pháp với hoàn mã mẫu: q_11423280WebApp.7z

+0

+1. Giải pháp tốt. – NotMe

2

Dưới đây là một thay thế cho tải điều khiển:

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 
} 
+0

Cảm ơn Ingenu !!!! có cách nào mà tôi có thể lấy đi bằng cách không chuyển sang Mặc định trên dòng thứ 3 không? Bằng cách này, tôi có thể tự động đi qua các trang khác nhau. Hiện tại, dòng sau sẽ không hoạt động nếu tôi muốn lặp qua các trang khác nhau: var page = (Default) Activator.CreateInstance (type); –

+0

Tôi thấy không có lý do tại sao không: 'var page = (Page) Activator.CreateInstance (type);' hoạt động tốt vì 'Default' kế thừa từ' Trang'. – Candide

Các vấn đề liên quan