相比于纯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编码