2010-08-31 30 views
8

我試圖爲所有基於文本的搜索實施自定義篩選器模板,並運行到構建查詢的問題中。我一直在下面貼在this blog的指示,但不知道如何改變GetQueryable方法執行ASP.NET動態數據TextSearch自定義篩選器模板

WHERE columnAttribute LIKE '%something%' 

查詢。在博客中的例子中,表達式是一種相等性,如果我輸入的文本與數據庫列中的文本完全匹配,則表達式將起作用。

目前我使用新的QueryExtender功能以及SearchExpression控件,但是這需要爲我需要的文本搜索功能的所有表創建幾個自定義頁面。我想通過創建自定義過濾器模板來幹這個。任何幫助將不勝感激。

回答

10

在LINQ to SQL中,Strings.Contains方法是您如何表達LIKE運算符。接下來的例子是你如何圍繞LIKE操作符創建一個filter template。在這個例子中,我們將給我們的自定義過濾器模板命名爲「文本」。第一步是更新Dynamic Data metadata。註釋所有你希望能夠與FilterUIHintAttribute像這樣搜索的列:

[FilterUIHint("Text")] 

現在,我們需要創建一個「文本」過濾器模板。創建在過濾器模板文件夾的Text.ascx用戶控制(通常爲 「〜/ DynamicData /過濾器」):

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Text.ascx.cs" Inherits="Text" %> 

<asp:TextBox runat="server" ID="TextBox1" autocomplete="off" OnTextChanged="TextBox1_Changed" /> 

接着創建代碼的後面,Text.ascx.cs

public partial class Text : QueryableFilterUserControl { 
    public override Control FilterControl { 
     get { return TextBox1; } 
    } 

    protected void TextBox1_Changed(object sender, EventArgs e) { 
     OnFilterChanged(); 
    } 

    public override IQueryable GetQueryable(IQueryable source) { 
     var value = TextBox1.Text; 
     if (String.IsNullOrWhiteSpace(value)) return source; 

     if (DefaultValues != null) { 
      DefaultValues[Column.Name] = value; 
     } 

     var parameter = Expression.Parameter(source.ElementType); 
     var columnProperty = Expression.PropertyOrField(parameter, Column.Name); 
     var likeValue = Expression.Constant(value, typeof (string)); 
     var condition = Expression.Call(
      columnProperty, 
      typeof (string).GetMethod("Contains"), 
      likeValue); 
     var where = Expression.Call(
      typeof (Queryable), 
      "Where", 
      new[] { source.ElementType }, 
      source.Expression, 
      Expression.Lambda(condition, parameter)); 
     return source.Provider.CreateQuery(where); 
    } 
} 

請注意,在更新文本過濾器後,我們沒有提供讓用戶回發頁面(並因此更新結果)的方法。就風格而言,我發現自動回發的TextBox控件會令人困惑,並且我發現使用單獨的按鈕回發每個單獨的過濾器是多餘的。相反,我喜歡在頁面模板中添加一個Button(例如,「〜/ DynamicData/PageTemplates/List.aspx」),以允許用戶回發頁面並更新結果。這裏是相關摘錄:

<asp:Panel runat="server" DefaultButton="UpdateFilter"> 
    <asp:QueryableFilterRepeater runat="server" ID="FilterRepeater"> 
     <ItemTemplate> 
      <asp:Label runat="server" Text='<%# Eval("DisplayName") %>' OnPreRender="Label_PreRender" /> 
      <asp:DynamicFilter runat="server" ID="DynamicFilter" OnFilterChanged="DynamicFilter_FilterChanged" /><br /> 
     </ItemTemplate> 
    </asp:QueryableFilterRepeater> 
    <asp:Button runat="server" ID="UpdateFilter" Text="Search" /> 
</asp:Panel> 

這就是它的全部。用戶現在應該能夠搜索包含指定列中文本片段的記錄。

+0

UpdateFilter按鈕做什麼使過濾器更新?當我點擊這個按鈕時,它什麼也不做。 – jpierson 2012-03-28 05:03:53

+0

@jpierson所有按鈕都會導致頁面回發。在回發的頁面生命週期期間,應該觸發'TextBox1_Changed',這實際上觸發了過濾器的更新。如果你有問題,你應該確認'TextBox1_Changed'實際上是被調用的。 – 2012-04-03 23:52:32

-2

您是否嘗試過使用jQuery來處理過濾和搜索?

Here是一個很好的教程,向您展示瞭如何使用jQuery和ASP.NET過濾和排序數據。