个人见解……
对于浏览器来说是不存在什么客户端控件和服务器端控件的,这是asp.net区分的,目的是为了更容易快捷的开发
服务器控件最终生成的仍然是普通的HTML,比如<asp:textbox>生成<input type="text">(可以在生成的页面中右键查看源文件比较)
可以这么理解,asp.net把你的代码翻译成了html呈现给浏览器,每次页面加载时都是生成html,你可以在页面上查看源文件,与你自己写的不一样的,
至于PostBack,是通过产生的Javascript实现的,服务器端控件postback后产生了许多的javascript代码,
示例:textbox的TextChanged事件
<asp:TextBox ID="TextBox1" runat="server" AutoPostBack="True"
ontextchanged="TextBox1_TextChanged"></asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="First_Load" />
protected void TextBox1_TextChanged(object sender, EventArgs e)
{
Button1.Text = "Postback!";
}
运行后,先查看查看源文件
右键-查看源文件
<input name="TextBox1" type="text" onchange="javascript:setTimeout('__doPostBack(\'TextBox1\',\'\')', 0)" onkeypress="if (WebForm_TextBoxKeyHandler(event) == false) return false;" id="TextBox1" />
<input type="submit" name="Button1" value="First_Load" id="Button1" />
注意到textbox生成的html控件<input name="TextBox1" type="text">加了个onchange 事件,这个是Javascript代码,不是我们自己写的吧?
还有一段javascript代码
右键-查看源文件得到的Javscript
<script type="text/javascript">
//<![CDATA[
var theForm = document.forms['form1'];
if (!theForm) {
theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
//]]>
</script>
这个是text的onchange事件中调用的一个函数?(待续……)
asp.net中使用Javascript
使用 事实上Page.ClientScript.RegisterClientScriptBlock 和 Page.ClientScript.RegisterStartupScript
使用 Page.ClientScript.RegisterClientScriptBlock生成的JavaScript 函数紧跟在 HTML 代码中开启元素 <form> 的后面。
而Page.ClientScript.RegisterStartupScript在闭合< /form>的前面
从字面上来理解,通过这两个方法可以让开发人员“有意”在生成的html中加入Javascript代码(postback产生的Javascript不是开发人员自己加的,
是asp.net为了“翻译准确”而加上去的)
你用asp.net写好一个文件,含有几次postback,这样的话每次的postback后生成的源文件是不一样的,不仅仅是“显示不同”
下面的代码显示了postback后会重新生成html文件,
aspx
Code
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>测试</title>
</head>
<body>
<form id="form1" runat="server">
<asp:Button ID="Button2" runat="server" Text="Button" />
<asp:Button ID="Button4" runat="server" Text="Button" />
</form>
</body>
</html>
aspx.cs
Code
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Button2.Text = "首次";
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "myscript", "function test()"+
"{alert('first_Load');"+
"return false;} ", true);
}
else
{
Button2.Text = "PostBck";
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "myscript", "function test()"+
"{alert('PostBack');"+
"return false;} ", true);
}
Button2.Attributes.Add("onclick","return test()");
}
查看首次生成的页面源文件
<script type="text/javascript">
//<![CDATA[
function test(){alert('first_Load');return false;} //]]>
</script>
点击左侧Button,弹窗“first_Load”
点击右侧按钮,使页面产生postback,再次查看页面源文件,
<script type="text/javascript">
//<![CDATA[
function test(){alert('PostBack');return false;} //]]>
</script>