LINQ से 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);
}
}
ध्यान दें कि हमने टेक्स्ट फ़िल्टर को अपडेट करने के बाद उपयोगकर्ता को पृष्ठ को पोस्ट करने के लिए कोई रास्ता नहीं दिया है (और इसलिए, परिणाम अपडेट करें)। शैली के मामले में, मुझे टेक्स्टबॉक्स नियंत्रण मिलते हैं जो ऑटो-पोस्टबैक भ्रमित होने के लिए, और मुझे लगता है कि प्रत्येक व्यक्तिगत फ़िल्टर को पोस्टबैक करने के लिए एक अलग बटन होने के लिए यह अनावश्यक है। इसके बजाय, मैं पेज टेम्पलेट में एक बटन जोड़ना चाहता हूं (उदाहरण के लिए, "~/डायनामिकडेटा/पेज टेम्पलेट्स/लिस्ट.एएसपीएक्स") जो उपयोगकर्ता को पेज को पोस्टबैक करने और परिणामों को अपडेट करने की अनुमति देता है। यहां प्रासंगिक अंश दिया गया है:
<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
@jpierson सभी बटन एक पृष्ठ पोस्टबैक का कारण बनता है। पेजबैक के पेज लाइफसाइकिल के दौरान, 'टेक्स्टबॉक्स 1_Changed' आग लगनी चाहिए, जो वास्तव में फ़िल्टर के अपडेट को ट्रिगर करता है। यदि आपको समस्याएं आ रही हैं, तो आपको यह सत्यापित करना चाहिए कि 'टेक्स्टबॉक्स 1_Changed' वास्तव में कहा जा रहा है। –