ASP.NET动态数据文本搜索自定义筛选器模板

ASP.NET动态数据文本搜索自定义筛选器模板,asp.net,visual-studio-2010,dynamic-data,Asp.net,Visual Studio 2010,Dynamic Data,我正在尝试为所有基于文本的搜索实现一个自定义筛选模板,但在构造查询时遇到了问题。我一直在遵循上发布的说明,但不确定如何更改GetQueryable方法以执行 WHERE columnAttribute LIKE '%something%' 询问。在博客上的示例中,如果我输入的文本与数据库列中的文本完全匹配,则表达式是一个等式 目前,我正在使用新的QueryXtender功能和SearchExpression控件,但这需要为我需要文本搜索功能的所有表创建多个自定义页面。我想通过创建自定义过滤器模

我正在尝试为所有基于文本的搜索实现一个自定义筛选模板,但在构造查询时遇到了问题。我一直在遵循上发布的说明,但不确定如何更改GetQueryable方法以执行

WHERE columnAttribute LIKE '%something%'
询问。在博客上的示例中,如果我输入的文本与数据库列中的文本完全匹配,则表达式是一个等式


目前,我正在使用新的QueryXtender功能和SearchExpression控件,但这需要为我需要文本搜索功能的所有表创建多个自定义页面。我想通过创建自定义过滤器模板来解决这个问题。非常感谢您的帮助。

您是否尝试过使用jQuery来处理筛选和搜索

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

在LINQ to SQL中,该方法是如何表示LIKE运算符的。下面是一个关于如何围绕LIKE操作符构建的示例。对于本例,我们将为自定义过滤器模板命名为“Text”

第一步是更新。用类似的方法注释所有要搜索的列,以便:

现在我们需要创建“文本”过滤器模板。在filter templates文件夹中创建Text.ascx用户控件(通常为“~/DynamicData/Filters”):

请注意,我们没有为用户提供在更新文本过滤器后回发页面(从而更新结果)的方法。就风格而言,我发现自动回发的文本框控件令人困惑,而且我发现有一个单独的按钮来回发每个单独的过滤器是多余的。相反,我喜欢在页面模板中添加一个按钮(例如,“~/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这个按钮所做的只是引起一个页面回发。在回发的页面生命周期中,应该触发
TextBox1\u Changed
,这实际上触发了过滤器的更新。如果您遇到问题,您应该验证
TextBox1\u Changed
是否实际被调用。
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Text.ascx.cs" Inherits="Text" %>

<asp:TextBox runat="server" ID="TextBox1" autocomplete="off" OnTextChanged="TextBox1_Changed" />
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);
    }
}
<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>