在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>
這就是它的全部。用戶現在應該能夠搜索包含指定列中文本片段的記錄。
UpdateFilter按鈕做什麼使過濾器更新?當我點擊這個按鈕時,它什麼也不做。 – jpierson 2012-03-28 05:03:53
@jpierson所有按鈕都會導致頁面回發。在回發的頁面生命週期期間,應該觸發'TextBox1_Changed',這實際上觸發了過濾器的更新。如果你有問題,你應該確認'TextBox1_Changed'實際上是被調用的。 – 2012-04-03 23:52:32