RadComboBox中的重音不敏感搜索

Jor*_*dec 5 asp.net telerik

我对使用ASP webforms和Telerik相对较新,但我正在寻找一种允许我在a中输入特殊字符(é,ù,à,...)的方法RadComboBox.

让我说我的名字ObjectDataSource叫"RenéTomebody".我需要通过搜索"Rene"和"René"来找到他,但到目前为止还没有运气.

在应用程序中,他们设法在RadGrid带有过滤器的情况下执行此操作,但RadComboBox就我所知,同样的解决方案并不起作用.

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

Ser*_*gGr 0

我无权访问后端组件,但您链接的演示包含前端代码,看起来您可以侵入那里。看起来这个控件可能既是客户端-服务器又是客户端。对于仅客户端的黑客来说,看起来有点复杂,并且涉及非公共 API ( _onInputChange),但对于客户端-服务器情况(这可能是您的情况),RadComboBox 对象客户端的文档提到了requestItems方法,因此黑客攻击它可能在未来是相当安全的:

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

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

\n\n
var accents = \'\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x95\xc3\x96\xc3\x98\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb8\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xb0\xc3\x87\xc3\xa7\xc3\x90\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f\xc3\xac\xc3\xad\xc3\xae\xc3\xaf\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\x91\xc3\xb1\xc5\xa0\xc5\xa1\xc5\xb8\xc3\xbf\xc3\xbd\xc5\xbd\xc5\xbe\';\nvar mappedAccents = "AAAAAAaaaaaaOOOOOOOooooooEEEEeeeeeCcDIIIIiiiiUUUUuuuuNnSsYyyZz";\nvar removeAccents = function (origStr) {\n    var components = [];\n    var len = origStr.length;\n    var afterLastAccent = 0;\n    for (var i = 0; i < len; i++) {\n        var mapPos = accents.indexOf(origStr[i]);\n        if (mapPos != -1) {\n            components.push(origStr.substr(afterLastAccent, i - afterLastAccent) + mappedAccents[mapPos]);\n            afterLastAccent = i + 1;\n        }\n    }\n    if (afterLastAccent < len)\n        components.push(origStr.substr(afterLastAccent, len - afterLastAccent));\n    return components.join(\'\');\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

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

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

\n\n
hackRadComboBoxFilter(Telerik.Web.UI.RadComboBox.prototype, removeAccents)\n
Run Code Online (Sandbox Code Playgroud)\n