2011-06-15 12 views
5

me sale esto:me sale una excepción mientras se utiliza un ViewState

System.Runtime.Serialization.SerializationException

Tipo 'System.Web.UI.WebControls.Button' en la Asamblea System.Web' , Versión = 4.0.0.0, Cultura = neutral, PublicKeyToken = b03f5f7f11d50a3a 'no está marcado como serializable. Descripción: Se produjo una excepción no controlada durante la ejecución de la solicitud web actual. Revise el seguimiento de la pila para obtener más información sobre el error y dónde se originó en el código.

Detalles de la excepción: System.Runtime.Serialization.SerializationException: Tipo 'System.Web.UI.WebControls.Button' en la Asamblea 'System.Web, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a' no es marcado como serializable.

lo entiendo cuando intento guardar una lista a un estado de vista y recuperarlo en caso Page_PreInit

puse los botones y añadirlos a una lista que más tarde Guardar a un estado de vista:

 ViewState["Buttons"] = buttons; 

entonces quiero recuperarlos y adjuntarlos a sus manejadores de sucesos:

void Page_PreInit(object sender, EventArgs e) 
    { 

     List<Button> btn = (List<Button>)ViewState["Buttons"]; 
     if (btn!=null) 
     { 
      foreach (var item in btn) 
      { 
       item.Width = 20; 
       item.Command += obtainTopicsPerPage_Click; 
       item.CommandName = tPage.ToString(); 
       item.Text = tPage.ToString(); 
      } 
     } 
    } 
+3

Almacenar un cierto valor del botón en el viewstate, no el objeto en sí y recrearlo desde el estado en la carga de la página siguiente. Alternativamente, el objeto Session puede almacenar referencias de objetos muy bien y menos con gastos indirectos para el cliente. – asawyer

+1

¿Cómo guardo el estado de los botones entre cada postback ... ya que todos sus eventos se han ido entre las devoluciones de datos: (... cuando presiono un botón después de que se desencadena un método de devolución de datos no se activa –

Respuesta

5

de acuerdo con la exceptio n mensaje, System.Web.UI.WebControls.Button no es serializable. (Esto no es sorprendente). Para guardar algo en ViewState, tiene que ser serializable para que su "auto" completo se pueda escribir en una cadena y guardar en el valor de formulario hidden en la página de ViewState.

¿Por qué está tratando de almacenar Button s en ViewState de todos modos? ViewState es útil para almacenar valores pequeños y, de otro modo, va en un campo oculto. Pero todo el control de la interfaz de usuario? ¿Qué estás tratando de lograr con eso?

Si sólo tiene que crear dinámicamente Button los controles basándose en algunos datos de ViewState, a continuación, sólo debe almacenar la cantidad mínima de datos para hacerlo posible y crear las Button s en el código de sus datos. Algo como esto:

List<string> btn = (List<string>)ViewState["ButtonStrings"]; 
foreach (var str in btn) 
{ 
    var item = new Button(); 
    item.Width = 20; 
    item.Command += obtainTopicsPerPage_Click; 
    item.CommandName = tPage.ToString(); 
    item.Text = tPage.ToString(); 
    // some use of the str from the ViewState 
    // or if all you need is a count, just store an int in ViewState and use a for loop 
} 
+0

de acuerdo con la respuesta provista por @David –

+0

Necesito que los botones se vuelvan a conectar con sus métodos de manejo par .. Más profundo en el código, conecto los botones programáticamente a eventhandlers. Pero como hay una publicación atrás, los botones no aparecen, y no tienen sus eventos. Por lo tanto, necesito volver a conectar sus controladores de eventos dentro del controlador de eventos prePage_init .. –

+2

@Dmitry Makovetskiyd: Parece que estás haciendo algo realmente malo. – leppie

Cuestiones relacionadas