我正在ASP.NET应用程序中构建“高级搜索”界面.我不需要为我写这个东西,但我坚持一个关于动态控件和ViewState的特定问题.我想知道如何处理这个方向.这是我的情况:
配料:
>一组可维护的API对象,表示实体,字段和搜索,用于处理构建搜索,生成sql和返回结果.所以这一切都得到了照顾.
> ASP.NET 3.5
所需的接口功能:
(1)在初始页面加载时,界面获得一个预先配置的Search对象,其中包含一组SearchCriterion对象.它将它们绑定到一组控件中(参见上图).
>有些搜索项目更简单,例如:
Field(DropDownList)|运算符(DropDownList)|价值(TextBox)
>某些字段类型的搜索条件控件具有存储在viewstate中的重要信息,例如:
Field(DropDownList)|运算符(DropDownList)|值(DropDownList),其中“值”下拉列表由数据库查询填充.
>某些字段是对其他实体的查找,这会导致一系列字段选择器,如:
Field(DropDownList)字段(DropDownList)|运算符(DropDownList)|值
>单击相应按钮添加和删除搜索条件
>通过更改“字段”,“运算符”或“值”来配置现有条件.如果选择/取消选择查找类型字段,则对字段或运算符的更改将要求控件通过更改可用运算符,将“值”输入控件更改为其他类型或从“字段”部分添加/删除DropDownLists来重新配置自身.
问题:
您可能已经知道如果您正在回答此问题,动态添加到页面的控件将在回发时消失.我已经创建了一个UserControl来操作控件集合并巧妙地完成上面的步骤(1),如附图所示. (显然,我现在并不关心风格.)
但是在Postback上,控件全部消失,我的Search API对象消失了.如果我可以让动态生成的控件集合发挥得很好并坚持使用ViewState,我可以检查回发上的控件,重建Search对象,然后整齐地处理控件事件.
可能的解决方案
>我可以使Search对象可序列化并将其存储在viewstate中.然后在页面加载时我可以抓住它并在页面加载时重建控件集合.但是我不确定这是否可以很好地控制引发事件,以及包含数据库数据的下拉列表的视图状态会发生什么 – 我可以把它取回来吗?我不得不在每次回发时重新查询数据库.
>我可以为这种事情开发一个自定义服务器控件(see this link)…但这对我来说是一个新主题,并且会涉及一些学习,而且我不完全确定自定义服务器控件是否可以更好地工作与非固定控制集合.有人知道吗?
>我在想我可能能够使用数据绑定控件完成此操作 – 例如,我可以将我的标准集合绑定到具有固定控件集合的转发器(可能隐藏未使用的“值”控件,使用内部转发器“字段”下拉列表).那么所有的信息都会保留在ViewState中……对吗?
>非常感谢任何新的想法.
谢谢你的帮助.
b.Fandango
解决方法
我将我的SearchCriterionControl放入一个asp:Repeater并将其绑定到我的对象集合.对于Field Chooser,我在嵌套的asp:Repeater中放置了一个asp:DropDownList,并将Field数组绑定到该数组.一切都很好,保持状态,实际上只需要很少的代码.所以我从来没有动态添加控件到页面,谢天谢地.
感谢您的建议,Ender,Matt和andrewWinn.