在做Web应用程序开发中,对展示的数据进行筛选时最常见的任务,之前的ASP.NET版本中,我们只能在DataSource控件中设置Where查询子句来实现,但是这种方式针对LinqDataSource和EntityDataSource控件实现起来很不方便,也不易于进行扩展。而在ASP.NET 4.0中,新提出了一个专门为数据筛选而准备的控件QueryExtender,看名字就知道是一个扩展的扩展,它能够扩展到LinqDataSource或EntityDataSource控件上,通过设置各种查询表达式,能够很方便进行数据的筛选。
QueryExtender基本使用方式如下示例代码所示:
<asp:QueryExtender ID="queryExtender" runat="server"
TargetControlID="DataSourceBlog">
...
</asp:QueryExtender>
而包含在QueryExtender中的是一些Expression,这些Expression都被定义在System.Web.UI.WebControls.Expressions命名空间下面,所以在使用QueryExtender控件之前,需要先注册一下命名空间:
<%@ Register TagPrefix="asp"
Namespace="System.Web.UI.WebControls.Expressions"
Assembly="System.Web.Extensions" %>
首先看一个简单的筛选示例,如下面的示例代码所示:
<asp:LinqDataSource ID="DataSourceBlog" runat="server"
ContextTypeName="TerryLee.QueryExtenderDemo.BlogDataContext"
EntityTypeName=""
TableName="Posts">
</asp:LinqDataSource>
<asp:QueryExtender ID="queryExtender" runat="server"
TargetControlID="DataSourceBlog">
<asp:SearchExpression SearchType="Contains" DataFields="Title">
<asp:ControlParameter ControlID="txtSearch" />
</asp:SearchExpression>
</asp:QueryExtender>
<br />
<asp:TextBox ID="txtSearch" runat="server"></asp:TextBox>
这里QueryExtender的属性TargetControlID指定的是所作用的DataSource控件ID,在QueryExtender中添加了一个SearchExpression表达式,SearchType指定的是搜索的类型,有三个可选值:Contains、EndsWith、StartsWith。DataFields指定查询哪个字段值,而包含在SearchExpression中的是一个ControlParameter参数,指定用哪个控件的输入值作为输入参数。这样就可以在界面上使用TextBox控件的输入来作为查询条件了。
运行后效果如下:

当输入搜索值之后,按下回车:

如果我们想以某一个范围值来作为查询条件,可以使用RangeExpression表达式,如下示例代码所示:
<asp:LinqDataSource ID="DataSourceBlog" runat="server"
ContextTypeName="TerryLee.QueryExtenderDemo.BlogDataContext"
EntityTypeName=""
TableName="Posts">
</asp:LinqDataSource>
<asp:QueryExtender ID="queryExtender" runat="server"
TargetControlID="DataSourceBlog">
<asp:RangeExpression DataField="UnitPrice" MinType="Inclusive"
MaxType="Inclusive">
<asp:ControlParameter ControlID="txtFrom" />
<asp:ControlParameter ControlID="txtTo" />
</asp:RangeExpression>
</asp:QueryExtender>
除了内置的几个常用Expression之外,还可以使用CustomExpression,即我们可以自定义一个方法,来进行筛选:
<asp:LinqDataSource ID="DataSourceBlog" runat="server"
ContextTypeName="TerryLee.QueryExtenderDemo.BlogDataContext"
EntityTypeName=""
TableName="Posts">
</asp:LinqDataSource>
<asp:QueryExtender ID="queryExtender" runat="server"
TargetControlID="DataSourceBlog">
<asp:CustomExpression OnQuerying="FilterPosts" />
</asp:QueryExtender>
自定义FilterPosts方法:
protected void FilterProducts(object sender, CustomExpressionEventArgs e)
{
e.Query = from p in e.Query.Cast<Post>()
where p.ID >= 10
select p;
}
通过各种类型的表达式,可以极大的实现数据筛选的灵活性,在ASP.NET 4.0中内置的表达式有:
OrderByExpression
MethodExpression
PropertyExpression
RangeExpression
SearchExpression
CustomExpression
本文简单介绍了ASP.NET 4.0中新内置的控件QueryExtender,以实现方便灵活的数据筛选。