对于我来说,AJAX是全新的。在一段时间以前,由于缺乏可试用的工具和现成的可用库,我读了一些文章才得到一些思想。然而最近,我发现了Ajax.NET-一个相当有力的支持异步回调的框架。
在本文中,我将描述基于Ajax.NET创建查找控件的经验。为了构建一个查找控件,你需要具备:
1. 一个服务器方法,它能够返回一个匹配记录的列表。
2. JavaScript程序,用以处理回寄并且显示一个匹配记录的列表。
3. 在ASPX/ASCX页面中具有一个输入字段。
在此,我将不描述Ajax.NET的安装,因为它很简单,并且网上有很多的资源可供你参考。
二、 服务器端部分
这部分比较简单。我仅需要创建一个方法,它返回一个ArrayList的匹配记录并在该方法所在的位置注册一个类:
public class Main : Page{ private void Page_Load(object sender, EventArgs e){ Utility.RegisterTypeForAjax(typeof (Main)); } [AjaxMethod()] public ArrayList GetSearchItems(string query){ ArrayList items = GetRecords(); ArrayList matchItems = new ArrayList(); foreach (string item in items){ if (item.ToLower().StartsWith(query.ToLower())) matchItems.Add(item); } return matchItems; } private ArrayList GetRecords(){ ArrayList items = new ArrayList(); items.Add("Ted"); items.Add("Teddy"); items.Add("Mark"); items.Add("Alfred"); return items; } . . . |
<INPUT id=search type=text name=search runat="server" autocomplete ="off"> <div id="list"></div> autocomplete="off"是必需的,用于告诉浏览器不要显示该输入域的可能的值。否则,我们的控件将不工作。 function GetSearchItems_CallBack(response) { var div = document.getElementById("list"); div.innerHTML = ""; if (response.value != null && response.value.length > 0) { for (var i = 0; i < response.value.length; ++i){ div.innerHTML += "<a href=\"javascript:Fill('" + response.value[i] + "');\">" + response.value[i] + "</a><br />"; } } |
private void Page_Load(object sender, EventArgs e){ search.Attributes.Add("onkeydown","javascript:Main.GetSearchItems(this.value,GetSearchItems_CallBack);"); Utility.RegisterTypeForAjax(typeof ( Main )); } |
四、 查找JavaScript
我以前从来没在JavaScript中处理过键盘问题(由我自己写一个大而复杂的脚本太复杂了)。我了解JavaScript,只是掌握得不如象C#一样好,因此我的第一反应是"在网上查找一些适合于我们的需要的东西"。应该说,没有多少自由脚本可用。我花了大约一个小时才找到一个好脚本。其参考地址是:http://www.nsftools.com/tips/XmlHttpLookup.js。
该脚本提供了一个函数来查询服务器。我仅在mainLoop函数中作了一点修改即满足了我的要求。
mainLoop = function() { val = escape(queryField.value); if(lastVal != val && searching == false){ var response = Main.GetSearchItems(val); showQueryDiv('smi', response.value); lastVal = val; } setTimeout('mainLoop()', 100); return true; }; |
using System; using System.Web.UI; using System.Web.UI.WebControls; namespace play{ /// <summary> /// AjaxLookup.cs /// </summary> public class AjaxLookup : TextBox{ private string scriptFile = ""; private string callBackFunction = ""; private string backgroundColor = "#EEE"; private string highlightColor = "#CCC"; private string font = "Verdana"; private string divPadding = "2px"; private string divBorder = "1px solid #CCC"; public string ScriptFile{ get { return scriptFile; } set { scriptFile = value; } } public string CallBackFunction{ get { return callBackFunction; } set { callBackFunction = value; } } public string BackgroundColor{ get { return backgroundColor; } set { backgroundColor = value; } } public string HighlightColor{ get { return highlightColor; } set { highlightColor = value; } } public string DivFont{ get { return font; } set { font = value; } } public string DivPadding{ get { return divPadding; } set { divPadding = value; } } public string DivBorder{ get { return divBorder; } set { divBorder = value; } } public AjaxLookup(){ this.Attributes.Add("autocomplete", "off"); } protected override void Render(HtmlTextWriter writer){ base.Render(writer); //绑定包含几乎所有逻辑的脚本 Page.RegisterStartupScript("LoadScript", "<script language='JavaScript' src='" + ScriptFile + "'>" + "</script>"); // 包括UI设置 string styles = String.Format( @"<script language='JavaScript'>var DIV_BG_COLOR = '{0}'; var DIV_HIGHLIGHT_COLOR = '{1}'; var DIV_FONT = '{2}'; var DIV_PADDING = '{3}'; var DIV_BORDER = '{4}'; </script>", BackgroundColor, HighlightColor, DivFont, DivPadding, DivBorder); Page.RegisterStartupScript("LookupStyles", styles); // 初始化回寄处理 Page.RegisterStartupScript("RegisterScript", "<script language='JavaScript'>" + "InitQueryCode('" + this.ClientID + "')</script>"); //设置正确的回调函数 Page.RegisterStartupScript("RegisterCallBack", @"<script language='JavaScript'> mainLoop = function() { val = escape(queryField.value); if(lastVal != val && searching == false){ var response = " + CallBackFunction + @"(val); showQueryDiv('smi', response.value); lastVal = val; } setTimeout('mainLoop()', 100); return true;}; </script>"); } } |
<Ajax:AjaxLookup Runat="Server" id="search" BackgroundColor="#EEE" DivBorder="1px solid #CCC" DivPadding="2px" DivFont="Arial" HighlightColor="#C30" CallBackFunction="Main.GetSearchItems" ScriptFile="lookup.js" /> |
这里是查找控件在运行结果中看上去的样子: