2011-06-09 12 views
5

estoy tratando de almacenar un Dictionary<string, string> en el ViewState de un control personalizado que estoy desarrollando para ASP.NET 2.0:¿Está almacenando el diccionario <cadena, cadena> en el estado de la vista ASP.NET?

private Dictionary<String, String> Items 
    { 
     get 
     { 
      object d = ViewState["Items"]; 
      return (d == null ? null : (Dictionary<String, String>)d); 
     } 
     set 
     { 
      ViewState["Items"] = value; 
     } 
    } 

Acceso que se ve así:

public void UpdateData 
{ 
    if (this.Items == null) 
     this.Items = new Dictionary<string, string>(); 
    else 
     this.Items.Clear(); 
    //Fill the collection 
} 

cuando se pone establecer la primera vez que se carga la página, parece funcionar bien. Pero en posteriores devoluciones de datos, el valor devuelto es siempre nulo (la primera condición siempre ocurre). La depuración muestra que obtiene null de ViewState en la propiedad get.

He hecho algunas investigaciones y tienen found que las clases deben implementar IStateManager ser salvable en ViewState y el Dictionary MSDN page parece indicar que Dictionary<TKey, TValue> no. Pero he almacenado diccionarios antes en ViewState sin ningún problema. ¿Que está pasando aqui? ¿Mi experiencia previa fue un golpe de suerte?

ACTUALIZACIÓN: He intentado añadir algo de código de prueba a la propiedad: ViewState["ItemTest"] = "foo"; en el set y string test = (string)ViewState["ItemTest"]; en el get. Como el Dictionary, sale nulo. Por lo tanto, no parece ser un problema con el Dictionary siendo serializable. Además, para aclarar, UpdateData se llama desde mi excepción RenderControl, que ocurre después de Page_Load en la página que contiene el control.

+2

¿Dónde está comprobando los valores? Creo que el ViewState se carga después del evento 'Init'. – keyboardP

+0

Como en la comprobación de nulo antes de volver? La primera vez que se carga la página, no va a haber un valor allí. –

+0

¿Su control se agrega estático o dinámico en su página? – ibram

Respuesta

8

Puede almacenar el diccionario en ViewState, pero está intentando hacerlo demasiado tarde en el ciclo de vida de la página. Del mismo modo que ViewState se carga después de Init, ViewState se guarda antes de que se muestren los controles. Mueva su lógica de RenderControl a otro método o manejador de eventos más temprano en el ciclo de vida, como PreRender.

protected override void OnPreRender(EventArgs e) 
{ 
    if (this.Items == null) 
    { 
     this.Items = new Dictionary<string, string>(); 
    } 

    base.OnPreRender(e); 
} 

Usted se dará cuenta de que el objeto ya no es nula en las devoluciones de datos posteriores, siempre y cuando ViewState no se está desactivada en el control o su matriz.

+0

Ok, lo comprobé nuevamente. Estás en lo correcto. –

1

Asegúrese de no estar accediendo a la propiedad demasiado pronto en el ciclo de vida de la página, ya que viewstate no se carga directamente.

¿Desde qué método (en qué punto del ciclo de vida de la página) está solicitando esta propiedad por primera vez?

+0

Se llama desde la anulación de 'RenderControl', que creo que está después de' Page_Load', por lo que debería estar allí. –

+0

Tal vez debería intentar y simplemente almacenar una cadena de la misma manera, ver si esa también es nula después de una devolución de datos. Si es nulo, probablemente tenga un problema con el ciclo de vida de la página. Si no está vacío, reducirá el problema. – thekip

Cuestiones relacionadas