ACTUALIZACIÓN:He estado experimentando con mis controles un poco más y creo que me he acercado. Por favor, sigue leyendo para obtener información actualizada.¿Por qué no se inicializan los elementos secundarios de mi control de usuario personalizado?
Tengo 2 controles de usuario de ASP.NET 2.0, uno de los cuales se coloca dentro de del otro. Dentro del control interno tengo un control de etiqueta HtmlAnchor
al cual intento establecer una URL desde el control externo. Cuando intento establecer la propiedad HRef
desde el marcado de la página de representación, el control HtmlAnchor
es null
y arroja una excepción.
La URL set
propiedad se llama antes del evento OnInit ya sea del interior o del exterior de control y antes de 'OnPreInit
' evento principal de la página. Supongo que esto se debe a que estoy estableciendo el URL del control secundario en el marcado del control principal en la página en la que estoy renderizando los controles, lo que significa que el valor está establecido antes del OnInit()
. Aquí está la versión (simplificada) del código que estoy usando:
[ParseChildren(true)]// <- Setting this to false makes the
// page render without an exception
// but ignores anything in the markup.
[PersistChildren(false)]
public partial class OuterControl : System.Web.UI.UserControl
{
// The private '_Inner' control is declared
// in the .ascx markup of the control
[PersistenceMode(PersistenceMode.InnerProperty)]
public InnerControl Inner
{
get{ return _Inner; }
set{ _Inner = value; }
}
}
public partial class InnerControl : System.Web.UI.UserControl
{
// The private 'linkHref' control is declared
// in the .ascx markup of the control
public string Url
{
get { return linkHref.HRef; }
set { linkHref.HRef = value; }
}
}
El OuterControl se utiliza en mi página Default.aspx como esto:
<uc1:OuterControl ID="OuterCtrl1" runat="server">
<Inner Url="#" />
</uc1:OuterControl>
En el ejemplo de marcado anterior, si Intento renderizar esta página, se lanza una excepción porque el control linkHref
es nulo. Utilizando mi depurador puedo ver que cada control dentro de InnerControl es nulo, pero ni el evento & OuterControl OnInit()
del InnerControl OuterControl se ha activado aún cuando se accede a la propiedad Url
.
ACTUALIZACIÓN
pensé añadiendo 'ParseChildren
' y 'PersistChildren
' ayudarían a los atributos. Los he usado en Controles de Servidor antes pero nunca en los Controles de Usuario, aunque el efecto parece ser similar. No creo que esté interpretando correctamente la documentación de estas dos propiedades, pero puede evitar que se produzcan excepciones. Sin embargo, el marcado de la página se ignora.
¿Alguien sabe una manera de tener este trabajo. No entiendo por qué estos controles obtienen valores establecidos antes del OnInit()
. Cuando intento establecer sus valores utilizando el marcado ASPX, el constructor para el InnerControl
se llama dos veces. Una vez para establecer los valores basados en el marcado (supongo) y de nuevo en OnInit()
(que supongo que es por qué los valores de marcado se ignoran).
¿Es este esfuerzo inútil o me estoy acercando desde el ángulo equivocado?
Estoy configurando HRef en el marcado de la página, no en el método OnInit. Sé que esto sucede antes del evento OnPreInit() de la página. Me gustaría poder usar el marcado para establecer valores de control si es posible, ya que significa no tener que volver a compilar para realizar cambios. –