gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 07:45:15 25 4
gpt4 key购买 nike

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

WHERE columnAttribute LIKE '%something%'

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

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

最佳答案

在 LINQ to SQL 中,Strings.Contains method 是您表达 LIKE 运算符的方式。以下是如何构建 filter template 的示例。围绕 LIKE 运算符。对于此示例,我们将为自定义过滤器模板命名为“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 控件令人困惑,而且我发现有一个单独的按钮来回发每个单独的过滤器是多余的。相反,我喜欢在页面模板中添加一个 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>

这里的所有都是它的。用户现在应该能够搜索在指定列中包含文本片段的记录。

关于ASP.NET 动态数据 TextSearch 自定义过滤器模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3612777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com