Asp.Net 服务器控件的个人理解

服务器控件
相比于纯html标签控件 更耗费服务器性能 ,
滥用服务器控件 会造成服务器压力过大 反映迟钝

所有的服务器控件 都会被处理成对应的html标签控件 
而之所以服务器控件 可激发后台事件 (例如 asp:Button 的OnClick事件)
因为可激发后台事件的服务器控件,都必须放在 唯一一个带有(runAt=“server”)属性 的 form 标签中
所谓的激发后台事件 其实就是 【由服务器控件生成的html控件 在前台激发提交表单到后台】

控件如何激发表单提交  后台如何知道是哪个控件激发的表单提交 又该执行哪个事件呢


服务器控件的激发分两种
1. asp:Button 会被编译成  <input type="submit" name="Button2" value="Button" id="Button2" /> 
就是submit按钮 不需要再多做处理 自身就有激发表单提交的能力

2. LinkButton , DropDownList 等 这样的控件 编译到前台 分别变成了 a标签 和 Select标签等 
了解 html的都知道 这些是无法主动激发form提交的, 既然无法主动激发 , 即必须 依赖 javascript 

  当 想页面拖入 LinkButton , DropDownList 等控件时执行后 (住:控件的AutoPostBack属性必须设为True)  
  运行到前台 查看页面源代码时 会发现 这时 前台多了一个script 标签  
  而这里面的 __doPostBack方法的作用就是 激发 表单提交
<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>



服务器控件而对应html标签 的onclick或onchange事件将被设为 __doPostBack('服务器控件ID','') 
用于监听事件 调用javascript方法 提交表单

后台如何知道是哪个控件激发的表单提交
1.对于依赖 __doPostBack 方法的 控件
注意下面两句  __doPostBack 方法中的代码,  根据传参顺序 可知

theForm.__EVENTTARGET.value = eventTarget;  这句 引起回送的控件的ID  赋值到 form表单的一个隐藏域
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
theForm.__EVENTARGUMENT.value = eventArgument;  这句激发表单提交 的 回调参数
(与控件相关的附加数据,也指定控件的哪个事件) 
(当控件只有唯一的一个事件比如 只绑定了点击事件是 为空)  
赋值到 form表单的一个隐藏域 
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />

服务器根据这两个参数 便可知道 什么控件引发的回传 该执行 哪个事件

2. 对于 Button 控件 不依赖于 __doPostBack
如果页面有两个 Button 按钮  ,当其中一个 点击 服务器 如何知道是哪个Button 引发的呢
很简单 
因为 当 html 中的 from 标签中 出现两个以上 Submit按钮时
其中一个 被点击引发回传  在后台获取 表单提交的信息中 
(除去 隐藏域 ,因为隐藏域中 记录所有的服务器控件的信息) 
将不包含 其他Submit 控件的值  
所以 能通过 能通过 控件 name属性(编译到前台生成的 html标签的 name属性) 
作为 Key 用Request.From[Key]获取到
Submit按钮(<input type="submit" name="Button2" value="Button" id="Button2" />)的Value  
就是激发表单提交的 控件
 
 
 
 最后注意 隐藏域 对于服务器控件尤为重要
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />


除了这两个 在执行 __doPostBack 方法是 根据传参 赋值 用于 告诉 后台是哪个服务器控件 激发的哪个事件

还有
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="" />


用于存储 服务器控件状态和ViewState存储的数据 (此数据的类型 必须支持 可序列化)
原理是 使用Base64编码

原文地址:https://www.cnblogs.com/wycm/p/5338913.html