9.1.3 引发客户端代码
假定已给页面添加了代码(在Visual Studio 2005中静态添加或在服务器端代码中动态添加),接着就需要确定代码何时执行了。最简单的方式是在页面中插入一个客户端脚本块,如下所示。
<script language=’JavaScript’>
window.alert("Hello, World");
</script>
大多数浏览器都会在加载页面的过程中执行这个脚本块。在页面加载过程中,当浏览器执行到这个脚本块时,就会执行块中的代码,然后继续加载页面。
但是,在要添加客户端代码的大多数情况下,都要把这些代码关联到某个客户端事件上(例如在用户单击按钮,在列表框中进行选择,离开文本框时,在浏览器上执行代码)。对于下面的讨论,假定例程SayHello已经用静态或动态方式添加到页面上,该例程只是调用了一个函数。
<script language='JavaScript'>
function SayHello()
{window.alert("Hello, World");}
</script>
代码是函数的一部分,所以不能在页面加载过程中执行。要执行SayHello例程,必须把它关联到某个客户端事件中。在服务器端代码上,可以选择执行该例程的客户端事件。
对于从服务器端WebForm控件中生成的HTML控件,大多数事件都不直接显示在ASP.NET对象模型上。但这有一个例外:按钮的onclick事件。要把客户端例程关联到按钮的onclick事件上,只需把按钮的OnClientClick事件设置为客户端例程名,例如下面CreateChildControls方法中的Visual Basic 2005代码。
Protected Overrides Sub CreateChildControls()
Dim btn As New Web.UI.WebControls.Button
btn.ID = "MyButton"
btn.Text = "Hello, World"
btn.OnClientClick = "SayHello();"
Me.Controls.Add(btn)
End Sub
C#的对应代码如下所示。
protected override void CreateChildControls()
{
Web.UI.WebControls.Button btn = new Web.UI.WebControls.Button();
btn.ID = "MyButton";
btn.Text = "Hello, World";
btn.OnClientClick = "SayHello();";
this.Controls.Add(btn);
}
要使用除按钮的onclick事件之外的其他事件,可以在控件的Attributes集合中添加新的事件特性。下面的Visual Basic 2005示例将onblur特性添加到文本框控件上,并把它设置为SayHello例程,从而把代码关联到文本框的客户端onblur事件上。
Dim txt As New TextBox
txt.ID = "TextBox1"
txt.Attributes("onblur") = "SayHello();"
Me.Controls.Add(txt)
C#的对应代码如下所示。
TextBox txt = new TextBox();
txt.ID = "TextBox1";
txt.Attributes["onblur"] = "SayHello();";
this.Controls.Add(txt);
如果控件不使用组成控件,就可以在控件的Render方法中使用writer对象的AddAttribute方法,把特性添加到控件上,如下面Visual Basic 2005的示例所示。
Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
writer.AddAttribute("type", "text")
writer.AddAttribute("id", "txtName;")
writer.AddAttribute("onblur", "SayHello();")
writer.RenderBeginTag("input")
writer.RenderEndTag()
End Sub
C#的对应代码如下所示。
protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
writer.AddAttribute("type", "text");
writer.AddAttribute("id", "txtName;");
writer.AddAttribute("onblur", "SayHello();");
writer.RenderBeginTag("input");
writer.RenderEndTag();
}
有了这些代码,浏览器获得的Web页面就会包含如下HTML。
<input type="text" id="txtName" onblur="SayHello();"
提示:
浏览器中引发的事件完全由控件生成的HTML控制。例如,如果自定义控件生成了HTML <span>和<div>标记,SayHello例程就不会运行—— 浏览器永远都不会为<span>和<div>标记生成onblur事件。
除了把某个代码块关联到客户端事件上之外,还可以把动态的客户端代码直接插入添加到控件的特性上。例如,下面的Visual Basic 2005代码直接把客户端代码添加到事件特性上,而不是添加一个函数调用。
Me.Attributes("onblur") = _
"javascript:window.alert('Hello, World');"
C#的对应代码如下所示。
this.Attributes["onblur"] =
"javascript:window.alert('Hello, World');"
将代码添加到控件的事件上,会干扰ASP.NET调用客户端验证代码的能力。如果开发人员在带有自定义控件的页面上使用验证控件,ASP.NET就会把客户端验证代码与自定义控件的客户端代码连接起来。在上述例子中,SayHello调用在最后使用的分号解决了这个问题,它可以确保SayHello调用以允许运行任何人的代码的方式连接起来。如果ASP.NET验证代码被添加到客户端代码中,结果将如下所示。
<input type="text" id="txtName"
onblur="return SayHello();if typeof((Page_ClientValidate...






