2009-11-20 7 views
6

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.

+0

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. –

Respuesta

13

Tome un vistazo a la ASP.NET Page Life Cycle y Understanding View State. Ver estado se carga después de la Inicialización, por lo que no podrá acceder a él en Page_Init. Sería mejor usar un campo oculto.

Si está inactivo usando View State, lo más temprano que puede obtener es anulando el método LoadViewState (Recuerde llamar al base.LoadViewState antes de intentar acceder).

+0

+1 buenas referencias con explicación –

+0

Gracias, eso lo aclaró. Ahora estoy en un dilema: necesito crear algunos controles en Page_Init, dependiendo del contenido del estado de la vista (o campo oculto, para el caso, que tampoco parece estar cargado en Page_Init). –

+0

Ohh si opta por el enfoque de campo oculto, deberá buscar 'Request.Forms' para el valor. El control del servidor actual no se cargará aún. Pruébalo. – Bob

1

perder de vista el ID del control de usuario antes de la devolución de datos a continuación, en la devolución de datos re-crear el control y asignar la identificación posterior y debe cargar automáticamente el ViewState de nuevo.

+0

Oh, sí, me olvidé de decir eso. De hecho, recreé el control del usuario en cada devolución, y me aseguro de que la ID sea la misma cada vez. El problema no es que el ViewState no se puede restaurar, sino que los cambios en el estado de visualización entre LoadControl y placeHolder.Controls.Add no se mantienen a menos que repita explícitamente los cambios después de que el control se haya agregado a la página. –

3

También debe agregar el control a la colección de controles ANTES de establecer la propiedad. ViewState no se registra hasta que se haya agregado a la colección de controles.

placeholder.Controls.Add(ctrl); 
((ControlType)ctrl).SomeProperty = someData; 
Cuestiones relacionadas