c# - ASP.NET WebForms Custom UserControl-base.SaveViewState() devuelve nulo, ¿por qué?
user-controls (1)
Tengo un UserControl personalizado con el que estoy trabajando, que aloja controles dinámicamente creados y me encuentro con una situación extraña en la que aparentemente estoy perdiendo información de ViewState. En mi método SaveViewState reemplazado en la llamada base.SaveViewState (), esperaría que me devuelva un objeto que contenga todo lo que estaba en ViewState, pero en su lugar devuelve nulo.
protected override object SaveViewState()
{
object[] tempState = new object[2];
tempState[0] = base.SaveViewState(); //***suspected issue here, tempState[0] == null -- why?
//? this.ViewState["CompanyID"] returns me the guid I''m expecting
//... code instantiating and populating lstDataControlInfos
tempState[1] = lstDataControlInfos;
return tempState;
}
Puse un punto de interrupción en ese método, y puedo usar la ventana inmediata para consultar ViewState ["CompanyID"] y verificar que haya una CompanyID almacenada en ViewState. Tal vez estoy malinterpretando algo acerca de ViewState, pero ¿esa llamada no debería devolver lo que ya está en ViewState (incluido mi CompanyID)? El problema se convierte en un problema en la devolución de datos en el método LoadViewState reemplazado, ya que no tengo forma de sacar CompanyID de ViewState; regresa nulo.
protected override void LoadViewState(object savedState)
{
object[] tempState = (object[])savedState;
//tempState[0] == null, as it was stored in the previous SaveViewState call
//any reference to ViewState["CompanyID"] comes back null
base.LoadViewState(tempState[0]);
}
Mencioné que tengo controles dinámicos a los que estoy serializando y deserializando desde ViewState dentro de este control, y parece que todos funcionan correctamente. ¿Qué causaría que base.SaveViewState () devuelva nulo cuando sé de hecho y puede verificar (a través de la ventana inmediata) hay datos en ViewState durante la llamada a SaveViewState?
Cuando guarda valores en ViewState, el valor se marca como sucio si se está siguiendo a ViewState.
El seguimiento comienza en TrackViewState, que está después de Inicializar y antes de Cargar.
El seguimiento finaliza en SaveViewState, que está después de PreRender.
Si no se realiza un seguimiento de ViewState cuando se establece un valor en ViewState, no se conservará cuando llame a SaveViewState. Esto es algo bueno: significa que puede usar ViewState durante la fase Init sin aumentar el ViewState serializado.
Cuando dinámicamente agrega controles al árbol, debe tener en cuenta que:
Los valores configurados antes de agregar el control al árbol de control no se conservarán, incluso si agrega el control mientras se realiza un seguimiento de ViewState.
Los valores establecidos después de agregar el control al árbol de control se mantendrán , si se encuentra en una fase en la que se rastrea ViewState.
¿En qué punto del ciclo de vida de la página está configurando ViewState ["CompanyID"], y lo hace antes o después de agregar su control al árbol de control?