asp.net - route - cargar un control de usuario programáticamente en un escritor de texto html
select asp-for asp-items (3)
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.
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.
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();
Ese código representa el control pero ninguno de los eventos llamados en la carga de página del control se activa. Hay un repetidor en el control que necesita disparar.
Tomé el método anterior de Hauge / Scott Guthrie y lo modifiqué para que no necesites usar la reflexión, o modificar un UserControl 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.
Publiqué el método y el uso de ayuda aquí
HTH, Jon
He estado usando el siguiente código proporcionado por Scott Guthrie en su blog durante 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 de object data
, permite la carga dinámica de datos en el control del usuario, y se puede utilizar para inyectar 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.
Puedes leer más sobre esto aquí
Saludos Jesper Hauge