En mi aplicación ASP.NET, Estoy cargando un Ascx dinámicamente usando LoadControl, utilizando el siguiente patrón:Viewstate de ascx pierde entre las devoluciones de datos
var ctrl = LoadControl("/path/to/control.ascx");
((ControlType)ctrl).SomeProperty = someData;
placeholder.Controls.Add(ctrl);
El control que agrego guarda el valor de la propiedad directamente a SomeProperty ViewState, de la siguiente manera:
public int? SomeProperty
{
get { return (int?)ViewState["SomeProperty"]; }
set { ViewState["SomeProperty"] = value; }
}
Después de eso, el control ascx vive una vida por sí mismo y todo va bien hasta que se produzca la devolución de datos. Cuando la página se publica, de repente el estado de la vista está vacío. Sospecho que esto sucede porque manipulo el ViewState antes de agregar el archivo ascx instanciado a mi página. Además, puedo evitar que el ViewState se pierda añadiendo la siguiente línea en el método de mi control ascx Page_Load()
:
SomeProperty = SomeProperty;
que tengo que hacer lo anterior para todos y cada propiedad para asegurarse de que el ViewState se conserva. Ahora, ¿hay una manera más bonita de hacer esto? Manipular ViewState después de que se haya agregado el .ascx instanciado a la página no es una opción: necesito el contenido de ViewState en los métodos Page_Init()
y Page_Load()
, que se activan en el instante en que agrego el archivo .ascx a mi página.
Gracias.
Una vez encontré un problema similar, y en mi caso el problema fue que en nuestra página base de todos los tiempos, configuramos todos los controles para que no utilicen viewstate. Mi punto es que agregar controles dinámicamente podría no ser necesariamente el problema, sino lugares ocultos donde viewstate está configurado como deshabilitado. –