代码之家  ›  专栏  ›  技术社区  ›  James Orr

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

  •  7
  • James Orr  · 技术社区  · 16 年前

    alt text http://img3.imageshack.us/img3/1488/advancedsearch.png

    成分:

    (1) 在初始页面加载时,界面会获得一个预配置的搜索对象,其中包含一组SearchCriterion对象。它将它们绑定到一组控件中(见上图)

    • 字段(DropDownList)|运算符(DropDownList)|值(TextBox)

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

    • 字段(DropDownList)字段(DropDownList)|运算符(DropDownList)|值

    • 通过单击相应的按钮添加和删除搜索条件

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

    问题:

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

    然而,在Postback上,控件都不见了,我的搜索API对象也不见了。如果我能让动态生成的控件集合正常运行并保持在ViewState中,我就可以在回发时检查控件,重建Search对象,然后整齐地处理控件事件。

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

    • see this link

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

    4 回复  |  直到 16 年前
        1
  •  4
  •   James Orr    16 年前

    我已经编码了大约一天,使用我在问题中建议的第三个选项——老派的数据绑定控件,我的工作做得很好。事实上,我只是在被迫详细写下问题时才想到这个想法的——这不是经常发生在你身上吗?

        2
  •  2
  •   Matt    16 年前

    如果你用jQuery抓取所有输入值,而不是对页面(或新的results.aspx页面)进行回发,会怎么样?或者,您可以使整个过程异步化,对web方法执行Ajax请求,获取结果,并根据需要在客户端进行填充?

    here 有关使用jQuery访问ASP的更多信息。NET页面方法。记住,页面方法必须是静态的(这很容易疏忽)。

    高度地

    例如:

    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
    

        3
  •  2
  •   andrewWinn    16 年前

    我无法为您提供需要执行的确切步骤,但我强烈建议您研究asp.net页面的生命周期。我曾经创建过一个用户控件作为DLL。我必须在生命周期的特定步骤捕获回发数据,并在其他步骤重新创建和重新绑定数据。此外,像viewstate这样的想法也只在某些时候可用。我知道我必须重写On_init、On_prerender和其他一些方法。

    很抱歉,我无法提供更多帮助,但我身上没有代码(它与一位老雇主在一起)。我希望这能有所帮助。

        4
  •  2
  •   Ender    16 年前