接着上次的内容。接下来我们让它的时间能不停走动。新建一个类TipTime3,新建脚本文件TipTime3.js,将TipTime2代码都复制过来。
为了能将C#的DateTime对象转换为JS的Date,需要将该时间距离1970-1-1午夜的毫秒数传给JS。
剩下的工作就是利用setInterval每隔1秒改变span标签的文本,略过。
下一步要实现利用AJAX获取服务端的时间。先要让控件实现ICallbackEventHandler接口。
该接口包含2个方法。 RaiseCallbackEvent用于处理客户端传递过来的参数,这里不需要,所以空着。 GetCallbackResult用于处理返回给客户端的数据,
这里为了使效果明显,返回了一个随机时间。
注意要在OnLoad方法中需要加上这一行:
Page.ClientScript.GetCallbackEventReference(this, "", "", "");
这样做是为了保证页面上生成了WebForm_DoCallback方法。
剩下的工作就是客户端去调用了。WebForm_DoCallback方法的参数说明依次为:
需要回调的控件的UniqueID
回调的参数
回调结束后客户端的响应事件
回调的上下文
回调出错后客户端的响应事件
是否异步
接着给按钮添加onclick事件,调用WebForm_DoCallback方法,在回调结束后的响应事件中将结果显示在span标签上就行了。
这时我们发现如果页面回传了,控件的位置就会回到原来的位置,因此需要在每次拖动结束后将位置存储在<input type=“hidden”/>标签中。
新建一个类TipTime4,新建脚本文件TipTime4.js,将TipTime3代码都复制过来。
新建两个属性X,Y用来存储控件在客户端的坐标,并在RenderContents方法中输出一个Input标签,保证客户端的坐标信息在回传时还存在。
注意这里对属性X,Y没有用ViewState存储,是因为这2两个值是存在于表单数据中,这个与TextBox控件的Text属性类似。
对上面的input标签一定要设置name属性,不然是不会随着表单提交的。
为了能让在回传后获取input标签的值,需要让控件实现IPostBackDataHandler接口
LoadPostData方法用来检查提交给服务器的数据,根据控件状态数据和回发数据是否发生更改而判断是否调用RaisePostDataChangedEvent方法,
如果返回true,则.NET Framework会自动调用RaisePostDataChangedEvent方法,在此方法中可以引发自己定义的事件。
这里只将回发数据存储到X,Y属性中。
接下来要在OnLoad事件中加上
Page.RegisterRequiresPostBack(this);
这是为了保证在回传时触发IPostBackDataHandler接口。
然后在AddAttributesToRender方法中设置控件的left、right属性:
最后在JS中拖动结束时将控件的坐标存入input标签中即可。
最后要加的功能是到了一个时间,自动回传触发自定义事件。新建一个类TipTime,新建脚本文件TipTime.js
将TipTime4代码都复制过来。先加一个属性,用来存储配置的定时时间:
接着定义自定义事件。这上面的写法都是固定的写法。这样在设计视图就能看到该事件了
然后实现IPostBackEventHandler接口
在条件成立时,就执行自定义事件。
下一步在JS中判断是否到时间了,如果是则调用__doPostBack方法来实现回传,并将控件的UniqueID作为参数传递过去,
这样服务端才能知道是哪个控件触发的回传事件。
需要注意的是必须在OnLoad方法中加上:
Page.ClientScript.GetPostBackEventReference(new PostBackOptions(this));
这样页面上才会有__doPostBack方法,并且才会触发IPostBackEventHandler接口。
至此,所有功能都实现了。
示例代码下载