首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASP.NET Dynamic Data TextSearch自定义筛选器模板

问ASP.NET Dynamic Data TextSearch自定义筛选器模板
EN

Stack Overflow用户
提问于 2010-09-01 04:05:30
回答 2查看 5.2K关注 0票数 8

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

代码语言:javascript
复制
WHERE columnAttribute LIKE '%something%'

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

目前,我正在使用新的QueryExtender特性和SearchExpression控件,但这需要为我需要文本搜索功能的所有表创建几个自定义页面。我想通过创建自定义筛选器模板来使其变得干爽。任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-07 00:39:35

在LINQ to SQL中,Strings.Contains方法是表示LIKE运算符的方式。下面是一个关于如何围绕LIKE操作符构建filter template的示例。在本例中,我们将自定义筛选器模板命名为"Text“。

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

代码语言:javascript
复制
[FilterUIHint("Text")]

现在我们需要创建"Text“过滤器模板。在筛选器模板文件夹(通常为“~/ Text.ascx /Filters”)中创建动态数据用户控件:

代码语言:javascript
复制
<%@ 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

代码语言:javascript
复制
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"),它允许用户回发页面并更新结果。以下是相关摘录:

代码语言:javascript
复制
<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>

非那样做不行。用户现在应该能够搜索在指定列中包含文本片段的记录。

票数 10
EN

Stack Overflow用户

发布于 2010-12-02 01:21:54

你有没有尝试过使用jQuery来处理过滤和搜索?

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

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3612777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档