alt文本http://img3.imageshack.us/img3/1488/advancedsearch.png
我正在构建一个ASP.NET应用程序中的“高级搜索”界面。我不需要这样为我写这个东西,但是我被一个关于动态控件和ViewState的特定问题困住了。我想就如何处理这一问题提出一些方向。以下是我的情况:
成分:
所需的接口功能:
(1)在初始页面加载时,接口将获得带有一组SearchCriterion对象的预先配置的搜索对象。它将它们绑定到一组控件中(参见上面的图像)。
(2)用户通过以下方式修改搜索:
(3)最后,用户点击“搜索”查看其结果。
问题:
如果您回答这个问题,您可能已经知道,动态添加到页面的控件将在回发时消失。我已经创建了一个UserControl,它操作控件集合并整洁地完成上面的步骤(1),正如您在附加的映像中所看到的那样。(显然,我现在并不关心风格。)
然而,在回发上,控件都消失了,我的Search对象也不见了。如果我能够让动态生成的控件集合只在ViewState中运行,我就可以检查回发上的控件,重新构建搜索对象,然后整洁地处理控件事件。
可能的解决方案
谢谢你的帮助。b.Fandango
发布于 2009-09-11 14:03:51
我已经编码了大约一天,我用我在我的问题-老学校数据库控件中建议的第三种选择来实现这个功能。事实上,当我被迫把问题写得很详细时,我才想到这个想法--这不是一直都发生在你身上吗?
我将SearchCriterionControl放入asp:中继器中,并将其绑定到对象集合中。对于字段选择器,我在嵌套的asp:中继器中放置了asp:DropDownList,并将字段数组绑定到其中。一切都工作得很好,保持状态,实际上只需要很少的代码。因此,谢天谢地,我不必动态地向页面添加控件。
谢谢你的建议,安德,马特和andrewWinn。
发布于 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更容易理解和实现时,这是混乱而复杂的)。
例如:
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查询)。
发布于 2009-09-10 18:42:11
我不能为您提供您需要执行的确切步骤,但我强烈建议查看asp.net页面的生命周期。我曾经将用户控件创建为DLL。我必须在生命周期中的特定步骤捕获回发数据,并在其他步骤重新创建和重新绑定数据。另外,像viewstate这样的思想也只能在特定的时间点上使用。我知道我必须重写On_init、On_prerender和其他一些方法。
对不起,我帮不上忙了,但我没有密码(这是一个老雇主的)。我希望这能帮到你。
https://stackoverflow.com/questions/1406134
复制相似问题