技术开发 频道

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

  用代码实现筛选

  QueryExtender控件通过使用RangeExpression和SearchExpression使得定义筛选逻辑变得很容易。同样,可以使用CustomExpression或者MethodExpression控件去通过代码的方式去实现筛选逻辑。实际上,当需要应用筛选逻辑时,CustomExpression会触发一个事件,你可以在这个事件里编写相关的处理代码。而MethodExpression则有点不同,你要编写一个静态的方法,并传入一个类型为IQueryable的对象并且返回的对象也是要相同的类型。传入该方法的对象实际上是在筛选逻辑前的一个查询实例,可以在其中编写你需要实现的查询条件,最后要返回这个查询实例。

  下面我们更详细去了解下MethodExpression。假设你要根据登陆了的用户的身份去筛选数据,比如管理员能看到所有产品信息但非管理员只能看到没打折的产品。则我们如上所述在静态方法中,传入IQueryable实例作为参数,返回的也对象类型也必须是IQueryable类型的,如下:

// C#
public static IQueryable FilterBasedOnUser(IQueryable query)
{
  
if (Roles.IsUserInRole("Administrators"))
      
// Return the query without filtering
      return query;
  
else
      
// Return only non-discontinued products
      return query.Where(p
=> p.Discontinued == false);
}


' VB
Public Shared Function FilterBasedOnUser(ByVal query As IQueryable(Of Product)) As IQueryable(Of product)
  
If Roles.IsUserInRole("Administrators") Then
      
' Return the query without filtering
      Return query
  
Else
      
' Return only non-discontinued products
      Return query.Where(Function(p) p.Discontinued = False)
  
End If
End Function
  而在前端的代码中,则只需要使用MethodExpression指出引用的方法即可,如下所示:
<asp:QueryExtender ID="qeByMethod" runat="server" TargetControlID="dsProducts">
  
<asp:MethodExpression MethodName="FilterBasedOnUser" />
</asp:QueryExtender>

 

  对返回的结果进行排序

  除了筛选数据外,QueryExtender控件还可以对筛选出来的数据集指定排列的顺序。这可以通过OrderByExpression去实现,只需要设定哪些字段是需要排序的并指出其排序的方向即可。比如要对ProductName进行升序排序的话,只需要如下实现即可:

<asp:QueryExtender ID="qeByMethod" runat="server" TargetControlID="dsProducts">
  
<asp:MethodExpression MethodName="FilterBasedOnUser" />
  
<asp:OrderByExpression DataField="ProductName" Direction="Ascending" />
</asp:QueryExtender>

 

  你也可以设置零个或多个ThenBy的标签,以说明对列排序时的次序,比如下面的例子说明了在产品名称相同的情况下,将根据单价的升序去排列。

<asp:QueryExtender ID="qeByMethod" runat="server" TargetControlID="dsProducts">
  
<asp:MethodExpression MethodName="FilterBasedOnUser" />
  
<asp:OrderByExpression DataField="ProductName" Direction="Ascending">
      
<asp:ThenBy DataField="UnitPrice" Direction="Descending" />
  
</asp:OrderByExpression>
</asp:QueryExtender>

 

  总结

  ASP.NET 4中新提供的控件QueryExtender,简化了对数据的筛选,甚至还可以指定筛选出来的数据的排序。其中RangeExpression允许开发者指定筛选数据的方式,而筛选的逻辑可以通过使用CustomExpression或MethodExpression去编写代码实现。

0
相关文章