2011-11-11 16 views
5

Tengo una carga de UserControl objetos (ascx archivos) en su propio pequeño proyecto. Luego hago referencia a este proyecto en dos proyectos: la API REST (que es un proyecto de biblioteca de clase) y el sitio web principal.Representación gráfica de un web UserControl

Estoy seguro de que esto sería fácil en el sitio web, simplemente use Controls.Add en cualquier Panel o el control ASP.NET funcionaría.

Sin embargo, ¿qué pasa con la API? ¿Hay alguna forma de que pueda renderizar el código HTML de este control simplemente conociendo el tipo de control? El método RenderControl no escribe ningún HTML al escritor ya que el ciclo de vida del control ni siquiera ha comenzado.

Tenga en cuenta que no tengo los controles en el proyecto web, por lo que no tengo una ruta virtual al archivo ascx. Entonces, el método LoadControl no funcionará aquí.

Todos los controles en realidad derivan del mismo control de base. ¿Hay algo que pueda hacer desde esta clase base que me permita cargar el control desde una instancia completamente nueva?

Respuesta

8

Esto es lo que he hecho recientemente, funciona bien, pero entiendo que las devoluciones de datos no funcionarán si las usa dentro de su aplicación ASP.NET.

[WebMethod] 
public static string GetMyUserControlHtml() 
{ 
    return RenderUserControl("Com.YourNameSpace.UI", "YourControlName"); 
} 

public static string RenderUserControl(string assembly, 
      string controlName) 
{ 
     FormlessPage pageHolder = 
       new FormlessPage() { AppRelativeTemplateSourceDirectory = HttpRuntime.AppDomainAppVirtualPath }; //allow for "~/" paths to resolve 

     dynamic control = null; 

     //assembly = "Com.YourNameSpace.UI"; //example 
     //controlName = "YourCustomControl" 
     string fullyQaulifiedAssemblyPath = string.Format("{0}.{1},{0}", assembly, controlName); 

     Type type = Type.GetType(fullyQaulifiedAssemblyPath); 
     if (type != null) 
     { 
      control = pageHolder.LoadControl(type, null); 
      control.Bla1 = "test"; //bypass compile time checks on property setters if needed 
      control.Blas2 = true; 

     }       

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


public class FormlessPage : Page 
{ 
    public override void VerifyRenderingInServerForm(Control control) 
    { 
    } 
} 
+0

Buscando buena rick. Estoy tratando de implementar eso ahora en mi estructura. Una cosa que he notado - 'HtmlForm form = new HtmlForm();'. Esta variable nunca se usa, porque 'form.Controls.Add' está comentada? ¿Me estoy perdiendo de algo? – Connell

+0

Voy a actualizar, hay una manera de hacerlo con un formulario regular, pero si su control no tiene una etiqueta de formulario o no agrega uno programáticamente, obtendrá un error de tiempo de ejecución. Eso es lo que la clase FormLessPage omite para usted. –

1

This debería funcionar. Puede crear un control de ese tipo y usar su propio HtmlTextWriter.

Cuestiones relacionadas