2

我正在尝试为使用jQuery auto-complete的自动完成下拉菜单创建一个 ASP .Net (VB.Net) 自定义控件。

基本流程是控件的使用者将设置一些属性(例如数据源),然后将其作为 javascript 注入以初始化自动完成。

涉及的部分很多,所以我可能错过了发布一些代码,如果您认为缺少某些内容,请发表评论,我会添加它。

消费者背后的代码(PreInit 事件):

myDropDown.DataCallback = "testFunc";

控件中的 DataCallback 属性:

Public Property DataCallback As String

后面的控制代码中的选项对象创建和javascript注入(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"作为它的值。我需要的是source's 的值testFunc(而不是字符串),因此它可以作为自动完成中的回调执行,而不是自动完成认为它是一个 URL。

4

1 回答 1

0

纠正这个问题的最简单方法是进行一些模式识别。出现问题是因为字符串属性被序列化为字符串并用引号引起来。相反,您希望它代表一个对象引用,这意味着摆脱那些引号。要删除引号,您可以将一个简单的正则表达式应用于序列化对象字符串:

Dim optionsJSON = _serializer.Serialize(optionsObject)
optionsJSON = Regex.Replace(optionsJSON , "(?<=""source"":)""(.+?)""", "$1")

这将做的是查找文本前面的带引号的字符串"source":并捕获内部的内容以捕获组#1。然后它将用内部文本替换整个匹配,有效地从回调函数名称的任一侧删除引号。

于 2012-05-02T19:59:51.747 回答