【问题标题】:How to get the asp:CheckBox out of the ViewState? (__ControlsRequirePostBackKey__)如何从 ViewState 中获取 asp:CheckBox? (__ControlsRequirePostBackKey__)
【发布时间】:2011-02-15 11:39:19
【问题描述】:

我正在尝试构建一个简单的 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 或其他操作。可以预防吗?

【问题讨论】:

  • 我在您发布的 ViewState 中没有看到 fileCheckBox。
  • 复选框在哪里?
  • ctl00$ContentPlaceHolder1$DirectoryLister1$ctl04$ctl00$UpgradeReport__Plus_gif
  • 添加了渲染fileCheckBox的代码...基本上它只是一个循环,通过将其存储在面板中的目录的文件。

标签: asp.net user-controls viewstate


【解决方案1】:

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

详情请参阅link

不过,要使控件不使用 ViewState,您可以对派生自 System.Web.UI.Control 的每个控件使用 EnableViewState="false"。

【讨论】:

  • 我认为控件执行 Page.RegisterRequiresPostBack(this);。如果我在自己的控制下做类似的事情,它最终会出现在 ViewState 中。
【解决方案2】:

在与 Viewstate 进行了相当多的斗争之后,我找到了解决同样问题的方法。

我已经覆盖了 HtmlInputCheckBox 类。

这是一个例子。

public class CheckBoxFenixHTML : HtmlInputCheckBox
    {

        public CheckBoxFenixHTML()
        {
        }


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

        }

    }

这对我来说很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 2012-11-19
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多