【问题标题】:Accent insensitive searching in RadComboBoxRadComboBox 中的重音不敏感搜索
【发布时间】:2017-08-21 11:40:14
【问题描述】:

我对使用 ASP 网络表单和 Telerik 比较陌生,但我正在寻找一种方法,可以让我在 RadComboBox 中输入特殊字符(é、ù、à、...)。

假设我在ObjectDataSource 中有一个名字,叫做“René Somebody”。我需要能够通过搜索“Rene”和“René”找到他,但到目前为止还没有运气。

在应用程序中,他们设法在带有过滤器的RadGrid 上执行此操作,但据我所知,同样的解决方案不适用于RadComboBox

他们在RadGrid中使用的解决方案:http://www.telerik.com/forums/accent-insensitive-filtering-filtering-on-a-different-column#YS1QT8P1U0-cRPFNfjvDzA

【问题讨论】:

    标签: asp.net telerik


    【解决方案1】:

    我无权访问后端组件,但您链接的演示包含前端代码,看起来您可以在那里破解。看起来这个控件可能既是客户端服务器又是客户端。对于客户端,只有黑客看起来有点复杂,并且涉及非公共 API (_onInputChange),但对于客户端-服务器案例(可能是你的情况),client side of RadComboBox Object 上的文档提到了 requestItems 方法,所以黑客可能是未来相当安全:

    var hackRadComboBoxFilter = function (combobox, filterProcessingFunction) {
        var oldRequestItems = combobox.requestItems;
    
        combobox.requestItems = function() {
            var args = Array.prototype.slice.call(arguments);
            // requestItems has several arguments but the text seems to be the
            // first one, so let's modify it and call the original method
            var origFilter = args[0];
            args[0] = filterProcessingFunction(origFilter);
            oldRequestItems.apply(this, args);
        }
    };
    

    不幸的是,我不知道在 JS 中处理重音的内置方法,但您也可以在这里破解一些简单的东西:

    var accents = 'ÀÁÂÃÄÅàáâãäåÒÓÔÕÕÖØòóôõöøÈÉÊËèéêëðÇçÐÌÍÎÏìíîïÙÚÛÜùúûüÑñŠšŸÿýŽž';
    var mappedAccents = "AAAAAAaaaaaaOOOOOOOooooooEEEEeeeeeCcDIIIIiiiiUUUUuuuuNnSsYyyZz";
    var removeAccents = function (origStr) {
        var components = [];
        var len = origStr.length;
        var afterLastAccent = 0;
        for (var i = 0; i < len; i++) {
            var mapPos = accents.indexOf(origStr[i]);
            if (mapPos != -1) {
                components.push(origStr.substr(afterLastAccent, i - afterLastAccent) + mappedAccents[mapPos]);
                afterLastAccent = i + 1;
            }
        }
        if (afterLastAccent < len)
            components.push(origStr.substr(afterLastAccent, len - afterLastAccent));
        return components.join('');
    };
    

    所以现在你可以把它组合成这样:

    // In real app you probably want something like this
    // var targetComboBox = $find("<%= RadComboBox1.ClientID %>");
    // but for test let's just hack first combobox on the page
    var targetComboBox = Telerik.Web.UI.RadComboBox.ComboBoxes[0];
    hackRadComboBoxFilter(targetComboBox, removeAccents);
    

    或者如果您想修改页面上的所有组合框,您可以使用相同的技巧更改原型:

    hackRadComboBoxFilter(Telerik.Web.UI.RadComboBox.prototype, removeAccents)
    

    【讨论】:

    • 感谢您的尝试。我发现您的帖子是实现此目的的唯一来源,因为 Telerik 支持团队刚刚回复我“这不受开箱即用的支持”并且没有提供任何真正的方法来实现这一目标。但是,我确实实现了你的整个代码,但它没有工作:(
    • @Luishg,您使用哪一组 Telerik 控件? Telerik 有几个类似的产品。您是否使用 KendoUI 或 Telerik UI 来实现 ASP.NET AJAX 或其他?这个答案已经有将近 2 年的历史了,可能已经过时,但也可能只是针对不同的工具箱。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 2012-01-28
    • 2011-04-06
    • 2019-03-21
    相关资源
    最近更新 更多