我正在尝试构建一个简单的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
或其他什么。这可以预防吗?
答案 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);
}
}
这对我来说很好。