【问题标题】:ASP.NET Dynamic Data TextSearch Custom Filter TemplateASP.NET 动态数据 TextSearch 自定义过滤器模板
【发布时间】:2011-04-06 11:32:51
【问题描述】:

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

WHERE columnAttribute LIKE '%something%'

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

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

【问题讨论】:

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


    【解决方案1】:

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

    第一步是更新Dynamic Data metadata。使用FilterUIHintAttribute 注释您希望能够搜索的所有列,如下所示:

    [FilterUIHint("Text")]
    

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

    <%@ 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 按钮所做的只是导致页面回发。在回发的页面生命周期中,TextBox1_Changed 应该触发,这实际上是触发过滤器更新的原因。如果您遇到问题,您应该确认 TextBox1_Changed 确实被调用了。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-28
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多