转载文章仅用于学习,谢谢作者!
当弹出列表选择其中的一项时触发事件, 设置ace的OnClientItemSelected 属性:
<ajaxToolkit:AutoCompleteExtender OnClientItemSelected="OnACEItemSelected"
OnACEItemSelected是一个js 函数:
function OnACEItemSelected(source, eventArgs) {
alert(eventArgs.get_value());
alert(eventArgs.get_text());
}
顾名思义, get_text() 返回文本, get_value() 返回值.
服务器端返回值的方法:
lst.Add("{'First':'00150-3030','Second':200}");
lst.Add("{'First':'木只八刀','Second':'moosdau'}");
可以看到, 显示出来的是"First" 的值, get_value() 方法可以得到隐藏的值.
注意字符串的构造方法: 除数值型外, 字符串两侧都要有单引号, 否则会反序列化失败.
现在来进一步看看到底发生了什么事.
try {
var pair = Sys.Serialization.JavaScriptSerializer.deserialize('(' + completionItems[i] + ')');
if (pair && pair.First) {
// Use the text and value pair returned from the web service
text = pair.First;
value = pair.Second;
} else {
// If the web service only returned a regular string, use it for
// both the text and the value
text = completionItems[i];
value = completionItems[i];
}
} catch (ex) {
text = completionItems[i];
value = completionItems[i];
}
.
这是从服务器端返回后, 展示到客户端之前的代码, var pair = Sys.Serialization.JavaScriptSerializer.deserialize('(' + completionItems[i] + ')'); 这一句, 就是关键点. 它执行了一个反序列化, 并且返回了一个包含”First” 和”Second” 属性的对象, 所以, 只要我们在服务器端把对象序列化一下就可以在这里得到正确的对象了. 这里使用的序列化方法, 被称作JSON 序列化.
JSON, 全称是JavaScript Object Notation,是一种文字格式标记法, 这种标记法在服务器端和客户端同时受支持, 服务器端的序列化方法是:
var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
string str = serializer.Serialize("something");
var obj = serializer.Deserialize<string>(str);
客户端的就如同我们已经看到的:
Sys.Serialization.JavaScriptSerializer.deserialize
这样就可以在客户端和服务器端之间传递对象了.
注: 实际上, 以前我自己写了一套序列化和反序列化的功能, 用于在B/S 之间传递对象, 这是跟AjaxToolKit 没什么关系的基础功能. 早知道微软已经做好了, 我当时