2008-11-03 3 views
6

Ich versuche, ein Benutzersteuerelement in eine Zeichenfolge zu rendern. Die Anwendung ist so eingerichtet, dass Benutzer Tokens verwenden können und Benutzersteuerelemente dort gerendert werden, wo die Token gefunden werden.Laden Sie ein Benutzersteuerelement programmgesteuert in einen HTML-Textwriter

StringBuilder sb = new StringBuilder(); 
StringWriter sw = new StringWriter(sb); 
HtmlTextWriter writer = new HtmlTextWriter(sw); 

Control uc = LoadControl("~/includes/HomepageNews.ascx"); 
uc.RenderControl(writer); 
return sb.ToString(); 

Dieser Code macht die Kontrolle, aber keine der in der Page_Load der Steuer genannt Ereignisse feuern. Es gibt einen Repeater in der Steuerung, der ausgelöst werden muss.

Antwort

13

Ich habe mit dem folgenden Code zur Verfügung gestellt von Scott Guthrie in seinem Blog seit geraumer Zeit:

public class ViewManager 
{ 
    public static string RenderView(string path, object data) 
    { 
     Page pageHolder = new Page(); 
     UserControl viewControl = (UserControl) pageHolder.LoadControl(path); 

     if (data != null) 
     { 
      Type viewControlType = viewControl.GetType(); 
      FieldInfo field = viewControlType.GetField("Data"); 
      if (field != null) 
      { 
       field.SetValue(viewControl, data); 
      } 
      else 
      { 
       throw new Exception("ViewFile: " + path + "has no data property"); 
      } 
     } 

     pageHolder.Controls.Add(viewControl); 
     StringWriter result = new StringWriter(); 
     HttpContext.Current.Server.Execute(pageHolder, result, false); 
     return result.ToString(); 
    } 
} 

Den object data Parameter ermöglicht die dynamischen Laden von Daten in die Benutzersteuerung und verwendet werden kann, um injiziere mehr als eine Variable über ein Array oder ähnliches in die Kontrolle.

Dieser Code löst alle normalen Ereignisse im Steuerelement aus.

You can read more about it here

Grüße Jesper Hauge

+0

Das HttpContext.Current.Server.Execute (pageHolder, Ergebnis, false); ist Geld –

+0

Genau das, was ich gesucht habe! Vielen Dank –

2

Sie müssten das Steuerelement an eine Seite anhängen, indem Sie es zu einer Controls-Auflistung der Seite oder einem Steuerelement auf der Seite hinzufügen. Dies löst nicht alle Ihre Probleme, es sei denn, Sie tun etwas, um das Rendering während des normalen Seitenrendereignisses explizit zu deaktivieren.

1

Ich nahm Hauges/Scott Guthrie Methode oben und zwickte es so, dass Sie brauchen, um Reflexion nicht zu verwenden, oder ein Benutzersteuerelement zu ändern, dass spezielle Schnittstelle zu implementieren. Der Schlüssel war, dass ich einen stark typisierten Callback hinzufügte, den die RenderView-Methode oben aufruft, anstatt Reflektion zu machen.

gebloggt ich die Hilfsmethode und Nutzungs here

HTH, Jon