2010-03-21 8 views
6

Używam klasy BuildManager do ładowania dynamicznie generowanego pliku ASPX, proszę zauważyć, że nie ma on odpowiedniego pliku .cs.Używanie klasy Build Manager do ładowania plików ASPX i zapełniania jej formantów

Używanie następującego kodu Jestem w stanie załadować plik aspx, jestem nawet w stanie przechwycić kolekcję kontrolną dynamicznie tworzonego pliku aspx, ale kiedy przypisuję wartości do kontrolek, nie wyświetlają się. na przykład jeśli wiążę wartość "Dummy" do kontroli strony aspx TextBox, pole tekstowe pozostaje puste.

Oto kod, który używam

 

protected void Page_Load(object sender, EventArgs e) 
    { 
     LoadPage("~/Demo.aspx"); 
    } 
    public static void LoadPage(string pagePath) 
    { 
     // get the compiled type of referenced path 
     Type type = BuildManager.GetCompiledType(pagePath); 


     // if type is null, could not determine page type 
     if (type == null) 
      throw new ApplicationException("Page " + pagePath + " not found"); 

     // cast page object (could also cast an interface instance as well) 
     // in this example, ASP220Page is a custom base page 
     System.Web.UI.Page pageView = (System.Web.UI.Page)Activator.CreateInstance(type); 

     // call page title 
     pageView.Title = "Dynamically loaded page..."; 

     // call custom property of ASP220Page 
     //pageView.InternalControls.Add(
     // new LiteralControl("
         
 
Served dynamically...")); // process the request with updated object ((IHttpHandler)pageView).ProcessRequest(HttpContext.Current); LoadDataInDynamicPage(pageView); } private static void LoadDataInDynamicPage(Page prvPage) { foreach (Control ctrl in prvPage.Controls) { //Find Form Control if (ctrl.ID != null) { if (ctrl.ID.Equals("form1")) { AllFormsClass cls = new AllFormsClass(); DataSet ds = cls.GetConditionalData("1"); foreach (Control ctr in ctrl.Controls) { if (ctr is TextBox) { if (ctr.ID.Contains("_M")) { TextBox drpControl = (TextBox)ctr; drpControl.Text = ds.Tables[0].Rows[0][ctr.ID].ToString(); } else if (ctr.ID.Contains("_O")) { TextBox drpControl = (TextBox)ctr; drpControl.Text = ds.Tables[1].Rows[0][ctr.ID].ToString(); } } } } } } }

Odpowiedz

4

Widziałem, że masz część kodu z How To Dynamically Load A Page For Processing. Przeczytaj również komentarze, takie jak ten one Mike'a.

Odwróć to:

((IHttpHandler)pageView).ProcessRequest(HttpContext.Current); 
LoadDataInDynamicPage(pageView); 

do tego:

LoadDataInDynamicPage(pageView); 
((IHttpHandler)pageView).ProcessRequest(HttpContext.Current); 

W tym zmieniającym się kolejność połączeń nie zmienia wynik końcowy myślę sprawy. Odwrotność Commutativity property. :)