如何从ViewState中获取asp:CheckBox? (__ControlsRequirePostBackKey__)

时间:2011-02-15 11:39:19

标签: asp.net user-controls viewstate

我正在尝试构建一个简单的Asp.Net网站,列出一些文件。需要检查每个文件。到现在为止还挺好。我在web.config中禁用了ViewState,但我仍然以那里的视图值结束。在使用ViewStateDecoder 2应用程序对其进行解码后,我发现我的ViewState看起来像这样:

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

我正在渲染的每个复选框都在其中!如何从中取出复选框?框中的会触发PostBack。我试过了fileCheckBox.AutoPostBack = false;,但它没有解决任何问题。

所以我的问题是:如何阻止我的复选框在ViewState中注册回发信息?

这是我的UserControl中的代码,它为每个文件生成一个CheckBox:

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

禁用控件的ViewState也不起作用。

理论

我怀疑控件来自Page.RegisterRequiresPostBack或其他什么。这可以预防吗?

2 个答案:

答案 0 :(得分:2)

CheckBox(也是TextBox和DropDownList)不仅使用ViewState来保存它们的值。他们实现IPostBackDataHandler以保持其在PostBack上的值。您必须为此问题找到自己的解决方案,因为禁用ViewState对您没有帮助。

有关详细信息,请参阅link

然而,要使控件不使用ViewState,可以对从System.Web.UI.Control派生的每个控件使用EnableViewState =“false”。

答案 1 :(得分:1)

在对抗Viewstate之后,我找到了解决同样问题的解决方案。

我已经覆盖了HtmlInputCheckBox类。

以下是示例。

public class CheckBoxFenixHTML : HtmlInputCheckBox
    {

        public CheckBoxFenixHTML()
        {
        }


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

        }

    }

这对我来说很好。