2010-08-31 2 views
8

Я пытаюсь реализовать шаблон пользовательского фильтра для всех текстовых запросов и столкнуться с проблемами при построении запроса. Я следовал инструкциям, которые размещены на this blog, но не знаю, как изменить GetQueryable метод для выполнения запросаASP.NET Dynamic Data TextSearch Пользовательский шаблон фильтра

WHERE columnAttribute LIKE '%something%' 

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

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

ответ

10

В 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> 

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

+0

Что делает кнопка UpdateFilter для обновления фильтров? Когда я реализую эту кнопку, она просто ничего не делает, когда я нажимаю на нее. – jpierson

+0

@jpierson Все, что делает кнопка, является причиной обратной передачи страницы. Во время жизненного цикла страницы postback 'TextBox1_Changed' должен срабатывать, что фактически инициирует обновление фильтров. Если у вас возникли проблемы, вы должны убедиться, что на самом деле вызывается 'TextBox1_Changed'. –

-2

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

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

Смежные вопросы