嵌在aspx页面中的两种服务器端脚本书写方式:
- <script runat=server>...</script>
服务器端脚本块,只用于字段和方法的声明。代码直接放入类的定义,不能包含有字段访问、方法调用等可执行语句。
<!-- test1.aspx -->
<%@ Page Language="C#" %>
<html>
<script runat=server>
//可以在块内声明函数,编译正确
protected void MyFunction()
{
_Message.InnerText="Hello!";
}
//不能在块内执行可执行语句,红色代码会导致编译错误
_Message.InnerText="Hello!";
</script>
<body>
<span id=_Message runat=server />
<body>
<html>
- <% ... %>
服务器端脚本标记,只用于字段的访问和方法的调用。代码放入Page派生类的Render函数主体中,在生成网页时,被调用。
<!-- test3.aspx -->
<%@ Page Language="C#" %>
<html>
<body>
<span id=_Message runat=server />
<%
//不能在标记对内声明函数,红色代码编译错误
protected void MyFunction()
{
_Message.InnerText="Hello!";
}
//可以在标记对内执行可执行代码,编译正确
//但页面不显示"Hello!"语句,原因见备注1
_Message.InnerText="Hello";
%>
<body>
<html>
备注1:所有在<% %>标记之内的服务器端代码,都要添加到Page类的Render方法中。这是,服务器端span已经把它自己呈交给响应缓冲区,并将内部文本设为空字符串。所以,此时的赋值不影响网页输出(受限于网页的生命周期,区别于传统的桌面控件模型)。如果要通过服务器端代码影响span的内部文本的输出,其代码如下:
<!-- test1.aspx -->
<%@ Page Language="C#" %>
<html>
<script runat=server>
protected void MyFunction(Object src,EventArgs e)
{
_Message.InnerText="Hello!";
}
protected void Page_Init(Object src,EventArgs e)
{
Page_Load += new EventHandler(MyFunction);
}
</script>
<body>
<span id=_Message runat=server />
<body>
<html>
备注2:既可以通过定义事件处理程序,也可以通过重写Page基类中定义的虚函数,与这类事件联系在一起。大多数服务器端的编程操作,应在网页的Load事件处理程序或者服务器端控件的事件处理程序中完成。在创建了所有服务器端控件,并从请求的POST主体中还原出它们的状态之后,Load事件激活。这样不仅有机会查看用户提交的值,并且有机会改变控件的值