在 ASP.NET 中构建动态“高级搜索”控件的建议

2024-02-14

替代文本 http://img3.imageshack.us/img3/1488/advancedsearch.png http://img3.imageshack.us/img3/1488/advancedsearch.png

我正在 ASP.NET 应用程序中构建“高级搜索”界面。我不需要为我写这个东西,但我陷入了有关动态控件和 ViewState 的特定问题。我想要一些关于如何解决这个问题的指导。这是我的情况:

原料:

  • 一组表示实体、字段和搜索的可用 API 对象,用于处理构建搜索、生成 SQL 和返回结果。这样就全部解决了。
  • ASP.NET 3.5

所需的接口功能:

(1) 在初始页面加载时,界面获取带有一组 SearchCriterion 对象的预配置搜索对象。它将它们绑定到一组控件中(参见上图。)

  • 有些搜索项更简单,例如:

    字段(下拉列表)|运算符(下拉列表)|值(文本框)

  • 某些字段类型的搜索条件控件在视图状态中存储了重要信息,例如:

    字段(下拉列表)|运算符(下拉列表)|值 (DropDownList),其中“值”下拉列表由数据库查询填充。

  • 某些字段是对其他实体的查找,这会导致一系列字段选择器,例如:

    字段(DropDownList) 字段(DropDownList)|运算符(下拉列表)|价值

(2) 用户通过以下方式修改搜索:

  • 通过单击相应按钮添加和删除搜索条件
  • 通过更改字段、运算符或值来配置现有条件。对字段或运算符的更改将要求控件通过更改可用运算符、将“值”输入控件更改为不同类型或在选择/取消选择查找类型字段的情况下从“字段”部分添加/删除 DropDownList 来重新配置自身。

(3) 最后,用户点击“搜索”查看结果。

问题:

如果您正在回答此问题,您可能已经知道,动态添加到页面的控件会在回发时消失。我创建了一个 UserControl 来操作控件集合并巧妙地完成上面的步骤 (1),如附图所示。 (显然,我现在并不关心风格。)

然而,在回发时,控件全部消失,我的搜索 API 对象也消失了。如果我能让动态生成的控件集合发挥良好作用并坚持在 ViewState 中,我就可以在回发时检查控件,重建搜索对象,然后巧妙地处理控件事件。

可能的解决方案

  • 我可以使搜索对象可序列化并将其存储在视图状态中。然后在页面加载时我可以抓取它并在页面加载时重建控件集合。但是我不确定这是否能很好地处理引发事件的控件,以及包含数据库中数据的下拉列表的视图状态会发生什么 - 我可以将其取回吗?对于我来说,每次回发都必须重新查询数据库是非常不希望的。

  • 我可以开发一个自定义服务器控件(看到这个链接 http://msdn.microsoft.com/en-us/library/zt27tfhy.aspx)对于这种事情......但这对我来说是一个新主题,需要一些学习,而且我不完全确定自定义服务器控件是否可以更好地与非固定控件集合一起工作。有人知道吗?

  • 我在想我也许能够使用数据绑定控件来完成此任务 - 例如,我可以将我的标准集合绑定到具有固定控件集合的转发器(也许隐藏未使用的“值”控件,使用内部转发器作为“字段”下拉列表)。那么所有信息都会保留在 ViewState 中......对吗?

  • 任何新想法将不胜感激。

感谢您的帮助。 b.范丹戈


我已经编码了大约一天,并且使用我在问题中建议的第三个选项 - 老式数据绑定控件,使这个工作完美地完成。事实上,我只是在被迫详细写出问题时才想到这个想法——这种情况不是经常发生在你身上吗?

我将 SearchCriterionControl 放入 asp:Repeater 并将其绑定到我的对象集合。对于字段选择器,我将一个 asp:DropDownList 放入嵌套的 asp:Repeater 中,并将字段数组绑定到它。一切都工作得很好,保持状态,实际上只需要很少的代码。所以我从来不需要向页面动态添加控件,谢天谢地。

感谢安德、马特和安德鲁温的建议。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 ASP.NET 中构建动态“高级搜索”控件的建议 的相关文章

随机推荐