Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get the asp:CheckBox out of the ViewState? (__ControlsRequirePostBackKey__)

I'm trying to build a simple Asp.Net website that will list some files. Each file need to be checked. So far, so good. I disabled the ViewState in the web.config, but I'm still ending up with a view values there. After decoding it with the ViewStateDecoder 2 app, I've found out that my ViewState looks like this:

<?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>

Each checkbox that I'm rendering is in it! How can I get the checkbox out of there? None of the boxes triggers a PostBack. I've tried fileCheckBox.AutoPostBack = false;, but it doesn't solve anything.

So my question is: How can I prevent my checkboxes from registering post back information in the ViewState?

This is the code in my UserControl that generates a CheckBox for each file:

        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);

Disabling the ViewState for the control doesn't work either.

Theory

I suspect the control from doing a Page.RegisterRequiresPostBack or something. Can this be prevented?

like image 772
Kees C. Bakker Avatar asked Feb 15 '11 11:02

Kees C. Bakker


2 Answers

CheckBox(also TextBox and DropDownList) do not use only ViewState to persist their values. They implement IPostBackDataHandler to keep their values on PostBack. You have to find Your own solution for this problem, because disabling ViewState won't help You.

See the link for the details.

Nevertheless, to make a control not to use ViewState, You can use EnableViewState="false" for every control which derives from the System.Web.UI.Control.

like image 121
zavaz Avatar answered Nov 15 '22 04:11

zavaz


After fighting quite a lot against Viewstate, I found a solution for the same problem.

I've override the class HtmlInputCheckBox.

Here is the example.

public class CheckBoxFenixHTML : HtmlInputCheckBox
    {

        public CheckBoxFenixHTML()
        {
        }


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

        }

    }

This works fine for me.

like image 36
Eduardo Mass Avatar answered Nov 15 '22 05:11

Eduardo Mass