转自:
http://blog.csdn.net/remy303/article/details/6588247
1.__doPostBack是什么,有什么用?
__doPostBack前面是两个“_”,属于javascript的一个方法,是用于客户端向服务器提交信息,从而调用后台。asp.net的服务器控件都会自动调用__doPostBack脚本。
2.__doPostBack的两个参数怎么理解?
该方法有两个参数:第一个参数为控件ID,第二个参数为事件参数。
3.客户端控件模拟服务器端控件postback
前台代码:
<form id="form1" runat="server">
<div>
</div>
<input type="hidden" />
// 服务器端控件有自己的__doPostBack事件
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
<asp:ImageButton ID="ImageButton1" runat="server" />
//此处为客户端控件,在其点击事件里调用__doPostBack脚本
<input id="buttonClient" type="button" οnclick="__doPostBack('form1',“test”);" />
<img id="image" οnclick="__doPostBack('image','test');" />
</form>
后台代码:
protected void Page_Load(object sender, EventArgs e)
{
string target = Request.Form["__EVENTTARGET"];
string args = Request.Params["__EVENTARGUMENT"];
foreach (string str in Request.Form)
{
Control c = Page.FindControl(str);
if (c is Button)
{
break;
}
}
}
public void Button1_Click(object sender, EventArgs e)
{
string target = Request.Form["__EVENTTARGET"];
string args = Request.Form["__EVENTARGUMENT"];
}
public void test()
{
}
}
结果:
发现问题1:当点击Button1即服务器端控件的时候会走到后台,而点击buttonClick按钮并不会,这是因为客户端控件即使有__doPostBack()方法也不会自动回发到服务器,
页面 上需要有回发服务器的控件,于是在form里加上下面的代码
<asp:LinkButton ID="linkBtn" runat="server" Visible="true">link</asp:LinkButton>
<asp:TextBox ID="TextBox2" runat="server" AutoPostBack="true"></asp:TextBox>
以上加的控件选择其一即可,这里要说明其中的一个问题:
发现问题2:
LinkButton不用设置AutoPostBack=“true”,而其它的控件需要设置该属性,才能成功。
发现问题3:
LinkButton的visible属性设置为false时又postback到后台,经调查结论是:因为当我们把visible属性设置为false的时候,浏览器在解析的时候,根本不会把这个控件放在页面上, 也就是说这个控件是不存在的,所以我们在调用__doPostBack函数的时候,便会找不到控件。
4.__doPostBack的原理
点击buttonClient按钮后右键页面查看源码会发现以下代码:
<div>
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__LASTFOCUS" id="__LASTFOCUS" value="" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKLTMxOTYzNjgyMGQYAQUeX19Db250cm9sc1JlcXVpcmVQb3N0QmFja0tleV9fFgEFDEltYWdlQnV0dG9uMRBnx90OJq2koEoz27efEVApisZJ" />
</div>
<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>
以上的代码为之前页面所没有的,点击后才加上的,红色的代码正是原理所在。即postback的时候页面会新建两个隐藏的自定义控件来存储doPostBack的两个参数,点击按钮即完成提交(submit)的动作,从而提交到服务器。
5:补充
对于服务器的ImageButton和Button来说,在后台的代码中以Request.Params["__EVENTARGUMENT"]和Request.Params["__EVENTTARGET"];
的方式得到的是空,而对于这两个之外的服务器控件都可以用上述的两个表达式得到__doPostBack的两个参数值。