Estoy agregando controles de usuario web a una página dinámicamente. Usar el método LoadControl
que solo toma una ruta virtual apuntando al .ascx
funciona muy bien. Sin embargo, la sobrecarga de LoadControl
que toma un tipo y una matriz de parámetros me está causando algunos dolores de cabeza.Cargar el control de usuario programáticamente usando LoadControl (Type, Object())
El control del usuario web se instancia como se esperaba, pero los controles contenidos en el control del usuario web son nulos y recibo una excepción tan pronto como intento trabajar con ellos. Extraño, porque funciona cuando se usa la primera versión de LoadControl
.
El control de usuario Web, simple, con un control Literal
:
<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="MyControl.ascx.vb" Inherits="MyControl" %>
<asp:Literal ID="myLiteral" runat="server"></asp:Literal>
código Los controles atrás:
Public Class MyControl
Inherits System.Web.UI.UserControl
Public Property Data As MyData
Public Sub New()
End Sub
Public Sub New(data As MyData)
Me.Data = data
End Sub
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
myLiteral.Text = Data.ID ' The Literal is null, but ONLY when I use the second LoadControl() method!
End Sub
End Class
Y el código correspondiente de la .aspx
de la que estoy tratando de cargar dinámicamente el control:
Private Sub Page_Init(sender As Object, e As System.EventArgs) Handles Me.Init
Dim x = LoadControl(GetType(MyControl), New Object() {New MyData With {.ID = 117}})
Page.Controls.Add(x)
' Using LoadControl("MyControl.ascx") works as expected!
End Sub
Parece que está invocando un constructor en un objeto ya creado, ¿cómo funciona eso? – jmoreno
@jmoreno Como los constructores son solo métodos estáticos con un poco de alboroto adicional, simplemente funciona. –
Aquí hay una demostración rápida: http://ideone.com/IoqU2Z (el código falla en la mayoría de los editores en línea porque requiere cierta demanda de seguridad, pero se ejecuta con total confianza). –