In LINQ to SQL ist die Strings.Contains Methode, wie Sie den LIKE-Operator ausdrücken. Was folgt, ist ein Beispiel dafür, wie Sie einen filter template um den LIKE-Operator bauen können. In diesem Beispiel geben wir unserer benutzerdefinierten Filtervorlage den Namen "Text".
Der erste Schritt besteht darin, die Dynamic Data metadata zu aktualisieren. Anmerken all Spalten, die Sie wollen in der Lage zu suchen, auf die FilterUIHintAttribute wie so:
[FilterUIHint("Text")]
Jetzt müssen wir die „Text“ Filtervorlage erstellen. Erstellen Sie die Text.ascx Benutzersteuerung im Filtervorlagen-Ordner (in der Regel "~/Dynamic/Filter"):
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Text.ascx.cs" Inherits="Text" %>
<asp:TextBox runat="server" ID="TextBox1" autocomplete="off" OnTextChanged="TextBox1_Changed" />
Als Nächstes erstellen Sie den Code hinter, 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);
}
}
Beachten Sie, dass wir dem Benutzer nach dem Aktualisieren des Textfilters keine Möglichkeit zum Postback der Seite (und damit zur Aktualisierung der Ergebnisse) geboten haben. Als eine Frage des Stils finde ich TextBox-Steuerelemente, die automatisches Postback verwirren, und ich finde, dass es überflüssig ist, eine separate Schaltfläche zu haben, um jeden einzelnen Filter zurückzuschicken. Stattdessen möchte ich der Seitenvorlage eine einzelne Schaltfläche hinzufügen (z. B. "~/DynamicData/PageTemplates/List.aspx"), mit der der Benutzer die Seite zurückschreiben und die Ergebnisse aktualisieren kann. Hier ist der relevante Auszug:
<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>
Das ist alles, was es ist. Benutzer sollten nun in der Lage sein, nach Datensätzen zu suchen, die Textfragmente in den angegebenen Spalten enthalten.
Was bewirkt die UpdateFilter-Schaltfläche, um die Filter zu aktualisieren? Wenn ich diesen Knopf anwende, tut es nichts, wenn ich darauf klicke. – jpierson
@jpierson Die gesamte Schaltfläche bewirkt einen Seitenpostback. Während des Seitenlebenszyklus des Postbacks sollte 'TextBox1_Changed' ausgelöst werden, was tatsächlich eine Aktualisierung der Filter auslöst. Wenn Sie Probleme haben, sollten Sie überprüfen, ob "TextBox1_Changed" tatsächlich aufgerufen wird. –