2009-05-08 10 views
10

¿Hay alguna forma de que pueda usar C# para cargar y luego "renderizar" un control ascx?Carga del componente ascx usando el código C#

Esencialmente estoy tratando de reemplazar ASP en línea con una función C# que devolverá el mismo HTML. Esto me permitiría establecerlo como un método web para que pueda actualizar esa sección de la página con jQuery, usando el mismo código que generó el html original.

Realmente necesito alguna forma de hacerlo, y esta parece ser una ruta lógica.

Respuesta

17

Es necesario crear una página en la que representar el control:

public static string RenderUserControl(string path) 
{ 
    Page pageHolder = new Page(); 
    Control viewControl = pageHolder.LoadControl(path); 

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

Un control de usuario por sí sola no hará que. (This article tiene alguna información relacionada de la cual tomé prestado algún código).

1

no he intentado esto, pero se puede cargar un control mediante la función LoadControl:

Control Example = LoadControl("~\\Controls\\MyControl.ascx"); 

entonces usted podría intentar representar el control:

StringWriter sw = new StringWriter(); 
HtmlTextWriter htw = new HtmlTextWriter(sw); 
Example.RenderControl(htw); 
Response.Write(sw.ToString()); 
Response.End(); 

Pero asegúrese de anulación VerifyRenderingInServerForm y cambiar EnableEventValidation a falso en la página.

Olvida lo que escribí arriba. Volví y probé y no puedes llamar a LoadControl porque el método web es estático. Dado que es estático, no tiene un objeto de página para llamar ... lo que significa que no se carga dinámicamente los controles de usuario.

+1

En realidad están mayormente derecha. MyUsercontrol uc = (MyUserControl) Page.LoadControl ("/ path/to/MyUserControl.ascx"); Entonces puede hacer SomeItem.Controls.Add (uc); o renderice el control en una cadena como lo demostró, luego agregue el elemento dom programáticamente usando jQuery, cualquiera de los dos funciona. – Serapth

+0

En realidad, no creo que agregar el control sea una opción en este caso. No hay devolución de datos completa (ningún objeto de página ni ningún objeto para agregar el control), llamadas desde jQuery, etc. Pero el enfoque de Keltex funciona. – JaCraig

1

Este Explanation debería tener las respuestas que está buscando. Básicamente, debes declarar el control en la página y luego LoadControl en el código subyacente.

1

La respuesta de Keltex fue la única que funcionó para mí ya que estaba trabajando con controles de usuario anidados. Además, si usted quiere pasar parámetros a su control de usuario, puede hacerlo a través de:

_MyNameSpace_MyUserControl viewcontrol = (_MyNameSpace_MyUserControl) pageHolder.LoadControl(path); 

viewcontrol.MyParam = "My value"; 
0

es muy fácil de usar:

yourItem.Controls.Add(LoadControl("~/user control File path")); 
Cuestiones relacionadas