服务器控件之二
在ASPNET页面上包含自定义的JavaScript函数,有两种方式:第一种方式是把Javascript直接应用于页面上的控件。
<%@ Page Language="VB" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server"> </script> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body onload="javascript:document.forms[0]['tb1'].value=Date();"> <form id="form1" runat="server"> <div> <asp:TextBox ID="tb1" runat="server" Width="300"></asp:TextBox> </div> </form> </body> </html>
即使使用的是Web服务器控件(标准TextBox服务器控件),仍能使用JavaScript在<body>元素的Onload属性中访问这个控件。通过使用服务器控件的Id属性,onload属性能指向特定的服务器控件。采用这个方法,还可以在页面上访问其他服务器控件。
ASPNET使用Page.ClientScript属性在页面上注册和使用JavaScript函数。
这里介绍3个比较有用的方法(更多的方法和属性可以通过ClientScript对象来获得)
1、RegisterClientScirptBlock方法可以把JavaScript函数放在页面的顶部。(该脚本用于在浏览器中启动页面)
<%@ Page Language="VB" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server"> Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Dim myScript As String = "function AlertHello(){alert('Hello ASP.NET');}" Page.ClientScript.RegisterClientScriptBlock(Me.GetType, "MyScript", myScript, True) End Sub </script> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>Adding JavaScript</title> </head> <body> <form id="form1" runat="server"> <div> <asp:Button ID="Button1" Text="AlertHello" runat="server" OnClientClick="AlertHello()" /> </div> </form> </body> </html>
使用Page.ClientScript.RegisterClientScriptBlock方法注册页面上的脚本。这样,.NET就自动把脚本放在页面上的<script>标记中。
2、Page.ClientScript.RegisterStartupScript
它与RegisterClientScriptBlock方法的区别不大,最大的区别在于它吧脚本放在ASPNET页面的底部,而不是顶部。
大多数情况下,应使用RegisterStartupScript方法,而不是RegisterClientScriptBlock方法。
如果使用RegisterClientScriptBlock,并且在Javascript引用控件值,运行这个页面,就会产生一个Javascript错误。
出错的原因是Javascript函数在文本框被放置到屏幕之前就已触发。所有Javascript函数没有找到TextBox1,导致页面抛出一个错误。
<%@ Page Language="VB" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server"> Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Dim myScript As String = "alert(document.forms[0]['textbox1'].value);" Page.ClientScript.RegisterStartupScript(Me.GetType, "mykey", myScript, True) End Sub </script> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <div> <asp:TextBox ID="textbox1" runat="server" >张继科,有你的节拍,全世界都是我们的主场!</asp:TextBox> <asp:Button ID ="button1" runat="server" OnClientClick="mykey" Text="点我"/> </div> </form> </body> </html>
这个方法把Javascript函数放在 页面的底部,所以实际启动时,就会找到textbox1元素,并按照希望的那样操作。
3、Page.ClientScript.RegisterClientScriptInclude
把Javascript放在js文件中,是最好的方式(因为很容易把对javascript的修改应用于整个应用程序)。
使用RegisterClientScriptInclude方法可以在ASPNET页面上注册脚本文件。
Dim myScript As String=”myJavaScriptCode.js”
Page.ClientScript.RegisterClientScriptInclude(“myKey”,myScript)
这会在ASPNET页面上创建如下代码:
<script src=”myJavaScriptCode.js” type=”text/javascript”></script>
ASPNET 3.5包含客户端回调功能,可以获取页面值,并把它们填充到已生成的页面上,而无须重新生成页面。这个功能是在ASPNET 2.0中引入,不需要进行整个回送循环,就可以修改页面上的值。也就是说,在更新页面时可以不重新绘制全部页面。使用回调功能,需要了解一些Javascript知识。
典型ASPNET页面的当前回送功能
在页面上触发一个页面事件,处理典型的回送内容时,要进行许多操作。比如:页面事件触发回送作为Post请求、初始化、加载状态、处理回送数据、加载、回送事件、保存状态、预显示、显示、卸载。
在正常的回送情况下,某个事件会触发一个要发送给Web服务器的HTTP Post请求。该事件会把Post请求发送给Web服务器,Web服务器再使用IPostbackEventHandler处理该请求,并通过一系列页面事件运行该请求。这些事件包括加载状态(在页面的视图状态中)、处理数据、处理回送事件,最后是显示所用浏览器解释的页面。该过程会在浏览器中重新加载页面,使页面上部出现闪烁现象并重新排列。
使用新的回调功能,事件的发生会把该事件传送给脚本事件处理程序(一个Javascript函数),该处理程序给Web服务器传送一个要处理的异步请求,ICallBackEventHandler通过一个类似于回送中使用的管道来运行请求,加载了信息后,结果就返回给脚本回调对象。加载了信息后,结果就返回给脚本回调对象,然后,脚本代码使用Javascript的功能把这些数据放在Web页面上,而无须刷新页面。