随着客户端技术的广泛使用,我们经常需要在 Page 类或用户控件中发射客户端函数调用。通常我们的做法是在 Load 或 PreRender 事件中通过 ClientScript 属性或 ScriptManager 类注册一小段客户端脚本来完成此项功能。这样做不是很方便,因为要做字符串拼接,另外传数据时经常需要用到隐藏字段或需要传多个参数。为此,我开发了一个扩展器,可在页面中声明式使用。这个扩展器的用法如下例所示(此示例用到了 jQuery):
<%@ Register Assembly="Rhinoceros.Web.UI.Controls" Namespace="Rhinoceros.Web.UI.Controls" TagPrefix="rhinos" %> <asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent"> <script type="text/javascript"> // Entry point function signature // first: TargetControlID element // second: indicates whether is post back // three: Data, customer data, can be object JSON serializable, sets in tag is string, if is other type,
sets in behind codes // this: ClientContext, if not provided, is Target control function operate(targetTextBox, isPostBack, data) { Sys.Debug.trace("this:"); Sys.Debug.traceDump($(this)); Sys.Debug.trace(String.format("Is post back? {0}", isPostBack)); Sys.Debug.trace("Data:"); Sys.Debug.traceDump(data); $(targetTextBox).change(function () { Sys.Debug.trace(targetTextBox.value); }); } </script> </asp:Content> <asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent"> <h2> Test Client Entry Point Extender </h2> <asp:TextBox runat="server" ID="myTextBox" /> <rhinos:ClientEntryPointSetterExtender runat="server" ID="EntryPointSetter" TargetControlID="myTextBox" ClientEntryPoint="operate" Data="Some text." /> <asp:Button ID="Button1" runat="server" Text="Submit" /> </asp:Content>
它有两个必填属性:
- TargetControlID:要扩展的控件的 ID,可以是任何控件;
- ClientEntryPoint:客户端函数名,在页面加载后调用。
有两个可选属性:
- Data:传入入口函数中的数据,支持任何类型,传入入口函数时自动进行 JSON 反序列化(如果声明式设置,则其类型为 String)
- ClientContext: 入口函数的上下文(this 引用),如果不指定,则为扩展元素(在上例中为文本框)
注意
此扩展器依赖于 ASP.NET AJAX 库和 AjaxToolket,必须在页面中声明 ScriptManager 控件并在应用程序中引用 AjaxToolkit 组件。