2008-11-03 8 views
6

Estoy tratando de convertir un control de usuario en una cadena. La aplicación está configurada para permitir que el usuario use tokens y los controles del usuario se representan donde se encuentran los tokens.cargar un control de usuario mediante programación en un escritor de texto html

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

Este código hace que el control, pero ninguno de los eventos llamados en el Load del control están disparando. Hay un repetidor en el control que necesita disparar.

Respuesta

13

He estado usando el siguiente código proporcionado por Scott Guthrie en su blog desde hace bastante tiempo:

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(); 
    } 
} 

El parámetro object data, permite la carga dinámica de datos en el control de usuario, y se puede utilizar para Inyecta más de una variable en el control a través de una matriz o algo similar.

Este código activará todos los eventos normales en el control.

You can read more about it here

Saludos Jesper Hauge

+0

Eso HttpContext.Current.Server.Execute (pageHolder, resultado, false); es dinero –

+0

¡Justo lo que estaba buscando! Gracias –

2

Debería adjuntar el control a una Página agregándolo a una colección de Controles de la Página o un Control en la página. Esto no resolverá todos tus problemas a menos que hagas algo para inhabilitar explícitamente el renderizado durante el evento de renderizado de página normal.

1

Tomé/método de Scott Guthrie de Hauge arriba y ajustado de tal manera que no es necesario utilizar la reflexión, o modificar un control de usuario para implementar cualquier interfaz especial. La clave fue que agregué una devolución de llamada fuertemente tipada que llama el método RenderView anterior, en lugar de hacer una reflexión.

blogged el método de ayuda y el uso here

HTH, Jon

Cuestiones relacionadas