周五在公司看到有看到Request.Params["__EVENTARGUMENT"]的代码不解,不解遂上网查找,发现一篇文章《Understanding the JavaScript __doPostBack Function》才初步了解了__doPostBack函数。
__doPostBack函数出现在ASP.NET web 控件触发回发,只有两个ASP.NET web 控件能触发doPostBack其他都要依赖__doPostBack函数,给web control添加AutoPostBack="True"属性,就会自动添加如下代码:
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<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>
通过上面的代码可以知道__doPostBack函数接收两个参数eventTarget和eventArgument。eventTarget包含触发回发控件的ID,eventArgument包含和控件相关的额外的数据。eventTarget和eventArgument的值存在隐藏fields。这两个隐藏变量可以在后台通过Request.Forms或Request.Params访问。
<select name="DropDownList1" onchange="javascript:setTimeout('__doPostBack(\'DropDownList1\',\'\')', 0)" id="DropDownList1">
<option selected="selected" value="FirstItem">FirstItem</option>
<option value="SecondItem">SecondItem</option> </select>
protected void Page_Load(object sender, EventArgs e)
{
string controlName = Request.Params.Get("__EVENTTARGET");
}
DropDownList的onchange事件处理函数中调用_doPostBack()方法,控件ID DropDownList1传递给__doPostBack函数然后存在hidden field(域)__EventTarget。这样在Page_Load就能取到__EventTarget的值,在这个实例中是DropDownList的ID。这样就能知道是那个控件触发了回发。
第三行提到只有两个web control不依赖_doPostBack触发回发,这两个控件应该是Button和ImageButton。给页面添加Button代码如下:
<asp:Button ID="Button1" runat="server" Text="Do PostBack" />
生成的Html代码:
<input type="submit" name="Button1" value="Do PostBack" id="Button1">
由上面的代码可知Button不会调用__doPostBack函数,因此__EventTarget将会为空。但是我们可以通过Button的ID在form集合中遍历找到Button:
Control control = null;
foreach (string str in Request.Form)
{
Control c = Page.FindControl(str);
if (c is Button)
{
control = c;
break;
}
}
由__doPostBack函数的第二个参数我们可以给__doPostBack传递参数,然后再后台可以通过Request.Forms.Get("__EventArgument")访问。