В LINQ to SQL метод Strings.Contains - это то, как вы выражаете оператор LIKE. Ниже приведен пример того, как вы можете построить filter template вокруг оператора LIKE. В этом примере мы дадим шаблонному шаблону фильтра имя «Текст».
Первым шагом является обновление Dynamic Data metadata. Комментирование всех столбцов, которые вы хотите, чтобы иметь возможность произвести поиск по с FilterUIHintAttribute как так:
[FilterUIHint("Text")]
Теперь нам нужно создать «Текст» шаблон фильтра. Создание Text.ascx управления пользователя в папке шаблонов фильтров (обычно "~/DynamicData/Filters"):
<%@ 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 автоматически переотправляют, и я считаю, что избыточно иметь отдельную кнопку для обратной передачи каждого отдельного фильтра. Вместо этого я хотел бы добавить одну кнопку к шаблону страницы (например, «~/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
@jpierson Все, что делает кнопка, является причиной обратной передачи страницы. Во время жизненного цикла страницы postback 'TextBox1_Changed' должен срабатывать, что фактически инициирует обновление фильтров. Если у вас возникли проблемы, вы должны убедиться, что на самом деле вызывается 'TextBox1_Changed'. –