2011-02-15 13 views
6

Estoy intentando crear un sitio web simple de Asp.Net que enumerará algunos archivos. Cada archivo debe ser verificado. Hasta aquí todo bien. Inhabilité el ViewState en el web.config, pero todavía estoy terminando con una vista de valores allí. Después de decodificar con la aplicación ViewStateDecoder 2, he descubierto que mi ViewState se ve así:Cómo obtener el asp: CheckBox fuera del ViewState? (__ControlsRequirePostBackKey__)

<?xml version="1.0" encoding="utf-16"?> 
<controlstate> 
    <HybridDictionary> 
    <DictionaryEntry> 
     <String>__ControlsRequirePostBackKey__</String> 
     <ArrayList> 
     <String>ctl00$ContentPlaceHolder1$DirectoryLister1$ctl01$d__bin</String> 
     <String>ctl00$ContentPlaceHolder1$DirectoryLister1$ctl02$d__obj</String> 
     <String>ctl00$ContentPlaceHolder1$DirectoryLister1$ctl02$ctl00$ctl00$d__Debug</String> 
     <String>ctl00$ContentPlaceHolder1$DirectoryLister1$ctl02$ctl00$ctl00$ctl00$ResGen_read_1_tlog</String> 
     <String>ctl00$ContentPlaceHolder1$DirectoryLister1$ctl02$ctl00$ctl00$ctl00$ResGen_write_1_tlog</String> 
     <String>ctl00$ContentPlaceHolder1$DirectoryLister1$ctl03$d__Properties</String> 
     <String>ctl00$ContentPlaceHolder1$DirectoryLister1$ctl03$ctl00$AssemblyInfo_cs</String> 
     <String>ctl00$ContentPlaceHolder1$DirectoryLister1$ctl04$d____UpgradeReport__Files</String> 
     <String>ctl00$ContentPlaceHolder1$DirectoryLister1$ctl04$ctl00$UpgradeReport_css</String> 
     <String>ctl00$ContentPlaceHolder1$DirectoryLister1$ctl04$ctl00$UpgradeReport_xslt</String> 
     <String>ctl00$ContentPlaceHolder1$DirectoryLister1$ctl04$ctl00$UpgradeReport__Minus_gif</String> 
     <String>ctl00$ContentPlaceHolder1$DirectoryLister1$ctl04$ctl00$UpgradeReport__Plus_gif</String> 
     </ArrayList> 
    </DictionaryEntry> 
    </HybridDictionary> 
</controlstate> 

Cada casilla de verificación que estoy prestación está en él! ¿Cómo puedo sacar la casilla de verificación de allí? Ninguno de los cuadros desencadena un PostBack. He intentado fileCheckBox.AutoPostBack = false;, pero no resuelve nada.

Así que mi pregunta es: ¿Cómo puedo evitar que mis casillas de verificación se registren en el ViewState?

Este es el código en mi control de usuario que genera una casilla para cada archivo:

 CheckBox fileCheckBox = new CheckBox(); 
     fileCheckBox.AutoPostBack = false; 
     fileCheckBox.CssClass = "file " + GetExtension(file.Name); 
     fileCheckBox.ID = MakeId(file.Name); 
     fileCheckBox.Checked = true; 
     fileCheckBox.Text = file.Name; 
     children.Controls.Add(fileCheckBox); 

Desactivación de la ViewState para el control no funciona bien.

Teoría

sospecho que el control de hacer una cosa o Page.RegisterRequiresPostBack. ¿Se puede prevenir esto?

+0

No veo fileCheckBox en ViewState que ha publicado. –

+0

donde están las casillas de verificación? – V4Vendetta

+0

ctl00 $ ContentPlaceHolder1 $ DirectoryLister1 $ ctl04 $ ctl00 $ UpgradeReport__Plus_gif

Respuesta

2

CheckBox (también TextBox y DropDownList) no usan solo ViewState para conservar sus valores. Implementan IPostBackDataHandler para mantener sus valores en PostBack. Tienes que encontrar tu propia solución para este problema, porque deshabilitar ViewState no te ayudará.

Consulte el link para los detalles.

Sin embargo, para hacer un control de no usar ViewState, puede usar EnableViewState = "false" para cada control que se deriva de System.Web.UI.Control.

+0

Creo que un control hace un Page.RegisterRequiresPostBack (this) ;. Si hago algo así bajo mi propio control, termina en ViewState. –

1

Después de luchar mucho contra Viewstate, encontré una solución para el mismo problema.

He reemplazado la clase HtmlInputCheckBox.

Aquí está el ejemplo.

public class CheckBoxFenixHTML : HtmlInputCheckBox 
    { 

     public CheckBoxFenixHTML() 
     { 
     } 


     protected override void OnPreRender(EventArgs e) 
     { 
      ViewState.SetItemDirty("checked", false); 

     } 

    } 

Esto funciona bien para mí.

Cuestiones relacionadas