ASP.NET动态数据TextSearch自定义过滤器模板

时间:2010-08-31 20:05:30

标签: asp.net visual-studio-2010 dynamic-data

我正在尝试为所有基于文本的搜索实现自定义过滤器模板,并遇到构建查询的问题。我一直在按照this blog上发布的说明进行操作,但不确定如何更改GetQueryable方法来执行

WHERE columnAttribute LIKE '%something%'

查询。在博客上的示例中,表达式是一个相等,如果我输入的文本与数据库列中的文本完全匹配,则该表达式有效。

目前我正在使用新的QueryExtender功能以及SearchExpression控件,但这需要为我需要文本搜索功能的所有表创建多个自定义页面。我想通过创建自定义过滤器模板来干掉它。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:10)

在LINQ to SQL中,Strings.Contains方法是表达LIKE运算符的方式。以下是如何围绕LIKE运算符构建filter template的示例。对于此示例,我们将为自定义过滤器模板指定名称“Text”。

第一步是更新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控件令人困惑,我发现有一个单独的按钮来回发每个单独的过滤器是多余的。相反,我喜欢在页面模板中添加一个Button(例如,“〜/ 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>

这就是它的全部。用户现在应该能够搜索包含指定列中文本片段的记录。

答案 1 :(得分:-2)

您是否尝试过使用jQuery来处理过滤和搜索?

Here是一个很棒的教程,向您展示如何使用jQuery和ASP.NET过滤和排序数据。