Шаблон настраиваемого фильтра TextSearch для динамических данных ASP.NET - PullRequest
8 голосов
/ 01 сентября 2010

Я пытаюсь реализовать собственный шаблон фильтра для всех текстовых поисков и сталкиваюсь с проблемами при построении запроса. Я следовал инструкциям, опубликованным в этом блоге , но не уверен, как изменить метод GetQueryable для выполнения

WHERE columnAttribute LIKE '%something%'

запрос. В примере на блоге выражение является равенством, которое работает, если введенный мной текст точно соответствует тексту в столбце базы данных.

В настоящее время я использую новую функцию QueryExtender вместе с элементом управления SearchExpression, но для этого необходимо создать несколько пользовательских страниц для всех таблиц, для которых мне нужна функция текстового поиска. Я хотел бы высушить это, создав собственный шаблон фильтра. Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

10 голосов
/ 06 февраля 2011

В LINQ to SQL метод Strings.Contains - это способ выражения оператора LIKE.Ниже приведен пример того, как вы можете построить шаблон фильтра вокруг оператора LIKE.Для этого примера мы дадим нашему шаблону фильтра имя «Текст».

Первым шагом является обновление метаданных динамических данных .С помощью 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>

Это все, что нужно сделать.Теперь пользователи должны иметь возможность искать записи, которые содержат фрагменты текста в указанных столбцах.

0 голосов
/ 01 декабря 2010

Вы пытались использовать jQuery для фильтрации и поиска?

Здесь - это великолепный учебник, который показывает, как фильтровать и сортировать данные с помощью jQuery и ASP.NET.

...