这段时间写asp.net代码遇到一个问题,如下代码,当用户点击确认后,js弹框给用户再次确认,再次点击确认后执行后台linkbutton代码,当用户点击取消时,执行另外的代码函数。
<asp:LinkButton ID="lbtnConfirmDeliverOffice" runat="server" OnClick="lbtnConfirmDeliverOffice_Click"
OnClientClick="return confirm('是否确定转送到承办部门?')" Width="35px" CssClass="btn btn-save">确认</asp:LinkButton>
在这个需求下,考虑使用__dopostback函数。函数的前面是两个下划线. __doPostBack= "_" + "_" + "doPostBack"。
一、了解__dopostback函数。
这个函数提供了在JavaScript脚本中执行服务器控件事件处理函数的能力,ASP.NET编程提供了服务器端控件和客户端控件之说,其本质还是脱离不了HTML,我们知道有些控件响应用户后需要做出一个和服务器端交互(PostBack)的过程,为了实现这个功能,ASP.NET服务器控件架构上增加了一个PostBack属性 当这个属性设置为Ture以后,页面就会自动产生__doPostBack函数用于处理用户的请求,另外页面上只要有LinkButton按钮也会自动产生__doPostBack函数,调用该函数提交不会触发控件的任何js事件而直接进入服务器端。 __doPostBack函数是一个纯粹并且是非常简单的javascript函数,大部分的页面PostBack都是由它触发的。注意,这里是“大部分”,因为只有两个(Button、ImageButton)会自己触发页面的PostBack,其它的所有控件都是通过__doPostBack函数触发页面的PostBack的,doPostBack通常都是有系统调用的,有时候为了处理一些特殊的需要,我要需要手动的触发__doPostBack函数。
函数原型:
function __doPostBack(eventTarget, eventArgument)
{
// 该函数用于执行服务器控件的事件处理函数
}
参数:
eventTarget: 要调用的服务器控件生成的name属性,如果是子控件,用''$'或':'分割,如: 父控件:子控件.
eventArgument: 调用事件时的参数
下面这段是直接从含有自动回传功能控件的.net Web页面的HTML源代码里面粘帖过来的。大家对照一下函数原型。
<div>
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTE4NDIzMDg2NDRkZMlHJoBQ9CYcWBtBK+zrfZzKoh/i" />
</div>
<script type="text/javascript">
<!--
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>
<div>
二、 __dopostback的简单应用。
前台代码:
<html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <div> </div> <input type="button" style="width: 55px" class="btn btn-cancel" onclick="myFunction()" value="确认" /> <asp:LinkButton ID="confirm" runat="server" onclick="LinkButton2_Click"></asp:LinkButton> <asp:LinkButton ID="cancel" runat="server" onclick="LinkButton1_Click"></asp:LinkButton> <script defer="defer" type="text/javascript"> function myFunction() { var result = window.confirm("Yes or NO?"); if (result) { __doPostBack('confirm',''); } else { __doPostBack('cancel',''); } } </script> </form> </body> </html>
后台代码 :
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace PartyStudio.Studio { public partial class WebForm1 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void LinkButton1_Click(object sender, EventArgs e) { Library.WebPage.LayoutHelper.MessageBoxJS("yes is choose"); } protected void LinkButton2_Click(object sender, EventArgs e) { Library.WebPage.LayoutHelper.MessageBoxJS("No is choose"); } } }
在页面中拖入两个linkbutton控件,后台中分别写入确认事件和取消事件的代码。再在前台页面加入一个按钮,onclick事件绑定js方法,判断
window.confirm("Yes or NO?");
返回的值,true则调用ID为“confirm”的linkbutton的__dopostback事件,false则调用ID为“cancel”的linkbutton的__dopostback事件。
调用__dopostback事件时,两个参数分别为(“linkbutton的ID”,“”)。
注意,传入的参数为linkbutton的clientID,也就是你自己定义的ID加上asp.net自动在前面加上的字符串。当中的“_”下划线要用“$”代替。