我正在尝试为使用 jQuery auto-complete 的自动完成下拉菜单创建一个 ASP .Net (VB.Net) 自定义控件.
基本流程是控件的使用者将设置一些属性(例如数据源),然后将其作为 javascript 注入(inject)以初始化自动完成。
涉及到很多部分,所以我可能遗漏了一些代码,如果您认为缺少某些内容,请发表评论,我会添加它。
消费者背后的代码(PreInit 事件):
myDropDown.DataCallback = "testFunc";
控件中的 DataCallback 属性:
Public Property DataCallback As String
控制代码后面的选项对象创建和javascript注入(inject)(PreRender事件):
Dim _serializer As New JavaScriptSerializer()
Dim optionsObject As New Dictionary(Of String, Object)
optionsObject.Add("source", DataCallback)
Dim optionsJSON = _serializer.Serialize(optionsObject)
Dim initializeScript = String.Format("initialize('{0}', {1});", ClientID, optionsJSON)
Attributes.Add("onfocusin", initializeScript)
最后是 javascript:
var initialize = function (controlID, options) {
if (options) {
$('#' + controlID).autocomplete(options);
}
// remove the blur event handler that called this initialize function
$('#' + controlID).removeAttr('onfocusin');
};
当我调试到 initialize
函数时,我看到 options
有一个属性,source
,带有字符串 "testFunc"
因为它的值(value)。我需要的是 source
的值为 testFunc
(不是字符串),因此它可以作为自动完成中的回调执行,而不是自动完成认为它是一个 URL .
最佳答案
纠正此问题的最简单方法是进行一些模式识别。出现问题是因为字符串属性被序列化为字符串并用引号引起来。相反,您希望它代表一个对象引用,这意味着去掉那些引号。要删除引号,可以将一个简单的正则表达式应用于序列化对象字符串:
Dim optionsJSON = _serializer.Serialize(optionsObject)
optionsJSON = Regex.Replace(optionsJSON , "(?<=""source"":)""(.+?)""", "$1")
这将执行的操作是查找以文本 "source":
开头的引用字符串,并捕获其中的内容以捕获组 #1。然后它将用内部文本替换整个匹配项,有效地删除回调函数名称两侧的引号。
关于javascript - 创建一个网络服务器控件来模仿 jquery 自动完成 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10418800/