alt text http://img3.imageshack.us/img3/1488/advancedsearch.png建议在ASP.NET
建立一个动态的“高级搜索”控制我建立在ASP.NET应用程序的“高级搜索”界面。我不需要为我写这个东西,但我被困在关于动态控件和ViewState的特定问题上。我想知道如何解决这个问题。这里是我的情况:
主料:
- 一个维修组表示实体,字段和搜索API对象,它可以处理构建搜索,生成SQL,并返回结果。所有这一切都照顾好了。
- ASP.NET 3.5
所需界面功能性:
(1)在初始页面加载,接口获取预先配置的搜索对象与一组SearchCriterion对象。它结合他们到一组控件
一些搜索项目是简单的,像(见上图):
场(的DropDownList)|运算符(DropDownList)|对于某些字段类型的值(文本框)
搜索标准控制已存储的重要信息视图状态,如:
场(的DropDownList)|运算符(DropDownList)|值(DropDownList)其中“值”下拉列表由数据库查询填充。
某些字段查找到其它实体,这导致场选择的链,如:
字段(DropDownList的)场(DropDownList的)|运算符(DropDownList)|值
(2)用户修改由所述搜索:
- 添加和通过点击各个按钮通过改变字段,操作员或值
- 配置现有标准卸下的搜索条件。对字段或操作员的更改将要求控件通过更改可用操作符,将“值”输入控件更改为其他类型,或者如果选择/取消选择查找类型字段,从“字段”部分添加/删除DropDownLists, 。
(3)最后,用户点击“搜索”查看他们的结果。
问题:
正如你可能已经知道,如果你回答这个问题,动态添加控件的页面消失回发。我已经创建了一个UserControl来操纵控件集合,并完整地完成上面的步骤(1),您可以在附加图像中看到它。 (很明显,我现在不关心风格。)
但是在Postback上,控件都没了,我的Search API对象也没有了。如果我可以让动态生成的控件集合在ViewState中很好地运行,我可以检查回发控件,重建搜索对象,然后整齐地处理控件事件。
可能的解决方案
我可以使搜索对象序列化并将其存储在视图状态中。然后在页面加载时,我可以抓取它并在页面加载时重新构建控件集合。不过,我不确定这是否能够很好地与控件引发事件以及包含数据库数据的下拉列表的视图状态发生了什么变化 - 我可以恢复它吗?我非常不希望在每次回发时重新查询数据库。
我可以为这种事情开发一个自定义服务器控件(see this link)......但这对我来说是一个新话题,并且涉及一些学习,另外我不完全确定一个自定义服务器控件是否会更好地使用非固定控制集合。有人知道吗?
我在想我可以使用数据绑定控件来完成此操作 - 例如我可以将我的标准集合绑定到具有固定控件集合的中继器(可以隐藏未使用的“值”控件,使用“字段”下拉列表的内部中继器)。那么所有的信息将保持在ViewState中...对吗?
任何新的想法将不胜感激。
感谢您的帮助。 b.Fandango
这是一篇很棒的文章,我试图构建几乎完全一样的搜索页面。你介意分享你的初始工作的任何例子,即创建“一组代表实体,字段和搜索的可用API对象,它们处理构建搜索,生成SQL并返回结果。”如果你有任何链接或信息要共享,这将是非常有益的,只是担心,如果已经有libs /框架在做这种事情,我不想重新发明轮子。谢谢,伟大的职位! – russds 2013-07-18 17:28:20
russds,我在一个中等规模的企业软件包上工作,该软件包有自己的元数据(实体和字段)和搜索实现。我无法与您分享我的雇主的任何源代码,尽管我确信他们不会介意我是否写过关于系统该部分的设计和实施。不过,我认为有很多“业务对象”基类库,可以为您提供这些类型的功能。我会看看我能为你找到什么,但我也建议你一边快速的谷歌。 – 2013-07-18 20:48:53
谢谢巴里。我做了一些谷歌搜索,但不完全是谷歌,我尝试过诸如“动态搜索UI”和“asp.net高级搜索”之类的东西,但没有具体的结果。你的描述正是我正在寻找的内容,我会搜索什么样的术语?谢谢! – russds 2013-07-25 20:18:39