技术开发 频道

ASP.NET 4过滤数据新控件QueryExtender

    【IT168 专稿】在ASP.NET 4中的一个新的控件是QueryExtender。QueryExtender控件是为了简化LinqDatasource或EntityDataSource控件返回的数据过滤而设计的,它主要是将过滤数据的逻辑从数据控件中分离出来。使用QueryExtender是十分容易的事,只需要简单往页面上增加一个QueryExtender控件,指定其数据源是哪个控件并设置过滤条件就可以了。比如,当在页面中显示产品的信息时,你可以使用该控件去显示那些在某个价格范围的产品,也可以搜索用户指定名称的产品。

  当然,不使用QueryExtender控件的话,LinqDataSource和EntityDataSource也是可以过滤数据的。这两个控件都有一个where的属性,可以指定过滤数据的条件。QueryExtender提供的是一种更简单的方式去过滤数据。本文包含了一系列的例子(可以,在本文最后下载),展示了QueryExtender的强大威力。

  首先要注意的是,QueryExtender控件只能配合LinqDataSource和EntityDatasource使用。它不能去过滤SqlDataSource控件的数据集。当然,使用该控件的话,你必须使用LINQ或者ADO.NET Entity框架。对这两者的讨论已经超出本文讨论的范围。简而言之,LINQ和Entity Framework是微软的对象关系映射工具,使用的是LinqDataSource和EntityDataSource两个控件,它们允许开发通过ORM的解决方案去访问数据库。

  本文附录的代码下载中,提供的例子使用的是ADO.NET Entity框架,并对Northwind数据库中的Products,Categories和Suppliers三张表进行了实体建模。其中数据库文件Northwind.mdf位于网站的App_Data目录下,App_Code目录下则有ADO.NET Entity框架的建模文件Northwind.edmx,它定义了对象实体和数据库表之间的关系。

  正如在本文介绍部分所说的,QueryExtender控件是配合LinqDatasource 和EntityDataSource 控件使用的。考察一个页面,允许用户输入一个最小的价格 ,之后就能显示小于或等于这个价格的所有产品。这个很容易用如下代码实现:

<b>Show All Prices Less Than:</b>
$
<asp:TextBox ID="txtMaxPrice" runat="server"></asp:TextBox>
<asp:Button ID="btnDisplayProducts" runat="server" Text="Show Products" />

<asp:GridView ID="gvProducts" runat="server" DataSourceID="dsProducts" ...>
   ...
</asp:GridView>

<asp:EntityDataSource ID="dsProducts" runat="server"
   ConnectionString
="name=NorthwindEntities"
   DefaultContainerName
="NorthwindEntities" EnableFlattening="False"
   EntitySetName
="Products" Where="it.UnitPrice <= @UnitPrice">
  
<WhereParameters>
      
<asp:ControlParameter ControlID="txtMaxPrice" Name="UnitPrice"
         PropertyName
="Text" Type="Decimal" />
  
</WhereParameters>
</asp:EntityDataSource>

1
 

   在上面的例子中,当用户在txtMaxPrice文本框中输入价格并点“Show Products”按钮后,会产生一个postback。在postback事件中,gridview与dsProducts这个数据源控件绑定,并查询Products表的内容,应用where条件去筛选出那些价格低于或等于在txtMaxPrice文本框输入的价格的产品。这个筛选可以象上文那样设置,也可以在程序中设置,只需要修改EntityDataSource 控件的selecting事件即可。

  使用EntityDataSource或者LinqDataSource两个控件的筛选逻辑去完成筛选有两个缺点。首先,它们都仅提供了有限的筛选功能,当然,有时对单一条件的筛选是可以应付的,但如果面对的是多条件筛选,比如要显示价格低于某个数值并且产品名,供应商或者目录包含某个指定的字符串,象这样的复杂条件的话是难实现的。另外一个缺点是过滤的逻辑与数据获取的逻辑功能都混杂在同一个控件中,维护其来比较麻烦。

  ASP.NET 4中的新控件QueryExtender,能让我们可以设置更多更复杂的筛选条件。更为重要的是,使用该控件能将数据的获取和数据的筛选两部分逻辑清晰的分离―使用EntityDataSource或者LinqDataSource去获得数据,QueryExtender则专门负责过滤数据,甚至可以设置如何去对结果集进行排序。

  使用QueryExtender 控件

  我们接下来看下该控件是如何做的,首先我们建立一个页面是列出所有的产品, 之后我们使用QueryExtender去列出产品中的一个部分。我们建立一个简单的页面,象刚才一样,将gridview绑定到EntityDataSource控件中去,如下代码所示:

<asp:GridView ID="gvProducts" runat="server" DataSourceID="dsProducts" ...>
   ...
</asp:GridView>

<asp:EntityDataSource ID="dsProducts" runat="server"
   ConnectionString
="name=NorthwindEntities" EntitySetName="Products"
   DefaultContainerName
="NorthwindEntities" EnableFlattening="False">
</asp:EntityDataSource>

 

  接着,往页面中增加一个QueryExtender控件。QueryExtender控件在工具面板的Data面板中,与gridview,EntityDataSource控件都是在一起的。接着,指定QueryExtender的数据源ID属性,表明要筛选的是哪个数据源控件的数据,这通过设置

  QueryExtender的TargetControlID去设置,我们这里设置的是dsProducts,如下:

<asp:QueryExtender ID="qeRange" runat="server" TargetControlID="dsProducts">
</asp:QueryExtender>

  

0
相关文章