首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ASP.NET中建立动态“高级搜索”控件的建议

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

Stack Overflow用户
提问于 2009-09-10 15:54:38
回答 4查看 5K关注 0票数 7

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

我正在构建一个ASP.NET应用程序中的“高级搜索”界面。我不需要这样为我写这个东西,但是我被一个关于动态控件和ViewState的特定问题困住了。我想就如何处理这一问题提出一些方向。以下是我的情况:

成分:

  • 表示实体、字段和搜索的一组可用的API对象,用于处理构造搜索、生成SQL和返回结果。所以这一切都搞定了。
  • ASP.NET 3.5

所需的接口功能:

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

  • 有些搜索项比较简单,例如: 字段(DropDownList) _(_
  • 某些字段类型的搜索规范控件在viewstate中存储了重要信息,如: 字段( dropdownlist ) \x运算符(DropDownList) \x值(DropDownList),其中的“值”下拉列表由数据库查询填充。
  • 有些字段是对其他实体的查找,这会导致字段选择器链,如: 字段(DropDownList)字段(DropDownList)维运算符(DropDownList)

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

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

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

问题:

如果您回答这个问题,您可能已经知道,动态添加到页面的控件将在回发时消失。我已经创建了一个UserControl,它操作控件集合并整洁地完成上面的步骤(1),正如您在附加的映像中所看到的那样。(显然,我现在并不关心风格。)

然而,在回发上,控件都消失了,我的Search对象也不见了。如果我能够让动态生成的控件集合只在ViewState中运行,我就可以检查回发上的控件,重新构建搜索对象,然后整洁地处理控件事件。

可能的解决方案

  • 我可以使搜索对象可序列化,并将其存储在viewstate中。然后,在页面加载时,我可以抓取它并在页面加载时重构控件集合。但是,我不确定这是否能很好地处理控件引发的事件,以及包含数据库数据的下拉列表的viewstate会发生什么--我能拿回它吗?在每次回发时都必须重新查询数据库,这对我来说是非常不可取的。
  • 我可以为这类事情开发一个自定义服务器控件(请参阅此链接) .但对于我来说,这是一个新的话题,需要学习,而且我不完全确定自定义服务器控件是否能更好地处理非固定控件集合。有人知道这事吗?
  • 我在想,我也许可以使用数据库控件来完成这个任务--例如,我可以将我的标准集合绑定到一个具有固定控件集合的中继器(可能隐藏未使用的"value“控件,使用内部中继器进行”字段“下拉列表)。那么所有的信息都会留在ViewState.对吗?
  • 任何新的想法都将不胜感激。

谢谢你的帮助。b.Fandango

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-09-11 14:03:51

我已经编码了大约一天,我用我在我的问题-老学校数据库控件中建议的第三种选择来实现这个功能。事实上,当我被迫把问题写得很详细时,我才想到这个想法--这不是一直都发生在你身上吗?

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

谢谢你的建议,安德,马特和andrewWinn。

票数 4
EN

Stack Overflow用户

发布于 2009-09-10 18:30:16

由于没有其他人对此进行了2个小时的尝试,我将使用一种根本不依赖viewstate的解决方案(或ASP.NET回发模型)来解决这个问题。

如果您使用jQuery抓取所有输入值,而不是进行回发,而是针对页面(或新的results.aspx页面)发布了一篇文章,该怎么办?或者,您可以对web方法执行Ajax请求,得到结果,并根据需要在客户端填充?

不幸的是,您必须重构使用哪种类型的控件来构造搜索查询,因为该数据不会与viewstate一起传递。但我想您已经需要将输入的数据转换成查询表单了。

有关使用这里访问ASP.NET页面方法的更多信息,请阅读ASP.NET。记住-页面方法必须是静态的(这是一个简单的疏忽)。

我不知道您在做什么服务器端来构造您的查询-但我强烈建议LINQ。我以前做过类似的“高级搜索”功能,经过几次不同的尝试后,我发现LINQ是解决这个问题的一个很好的工具,不管我是用LINQtoSQL访问SQL,还是只是点击内存中的对象集合。

这非常有效,因为1) LINQ被推迟执行,2) LINQ查询返回另一个可查询的对象。这里的含义是,您可以在从输入构建LINQ查询时将它们链接在一起,而不必执行将大量子句转换到SQL或您正在使用的任何回收站(我的尝试之一是用字符串构造SQL子句,但仍然通过SQLParameters传递输入数据以进行SQL注入保护--手工构建LINQ更容易理解和实现时,这是混乱而复杂的)。

例如:

代码语言:javascript
复制
List<string> data; // or perhaps your a DB Context for LINQtoSQL?

var query = data.Where(item => item.contains("foo"));

if( {user supplies length search option} )
    query = query.Where(item => item.Length < 5);

// etc, etc.

// LINQ doesn't do anything until the query is iterated, at which point
// it will construct the SQL statement without you worrying about details or parameter binding
foreach(string value in query)
    ; // do something with the results

由于延迟执行和可查询的返回类型,您可以一整天将LINQ查询连接到该表达式,并让它在执行时担心实现细节(例如转换为SQL查询)。

票数 2
EN

Stack Overflow用户

发布于 2009-09-10 18:42:11

我不能为您提供您需要执行的确切步骤,但我强烈建议查看asp.net页面的生命周期。我曾经将用户控件创建为DLL。我必须在生命周期中的特定步骤捕获回发数据,并在其他步骤重新创建和重新绑定数据。另外,像viewstate这样的思想也只能在特定的时间点上使用。我知道我必须重写On_init、On_prerender和其他一些方法。

对不起,我帮不上忙了,但我没有密码(这是一个老雇主的)。我希望这能帮到你。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1406134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档