在NET中 使用服务器按钮和链接按钮的时候通过页面上的动作可以触发后台程序实际上NET是通过执行一个客户端的__doPostBack(eventTarget eventArgument); 方法来进行分析事件和参数并提交的通常情况下是不需要做什么额外的了解但是如果在动作之后提交之前想再插入其他的一些操作就有必要了解下 当在提交前只是普通的确认或则选择是否的时候我们可以用 JS的alert或confirm 方法这些方法不会影响页面的提交所以也不用额外的考虑NET在客户端的处理方法但是如果用户点击按钮后还需要在用户执行其他客户端事件后再进行提交那么你会发现 NET的后台无法确认处理事件这是因为NET的按钮提交提供了参数后台通过POST来的参数获得事件信息并予以相应的后台处理方法由于在按钮动作后并不立即提交在处理其他客户端事件后提交的参数没了或则说不由NET发送页面了所以后台无法获得参数来执行事件 处理方法很简单了解下NET生成的客户端是怎么处理事件以及相应的参数以及怎么发送到服务器的就知道了 最重要的就是__doPostBack这个函数他的两个参数eventTarget eventArgument 写过自定义控件你就会了解到控件生成这两个参数的目的就是在回送的时候获取是哪个控件触发了回送并且带了什么参数 也就是说在你自己的客户端方法中调用__doPostBack 并带上适当的参数就可以像NET的处理方法一样的回送页面并让后台处理方法了 建立一个LINKBUTTON控件你回发现控件生成脚本里的__doPostBack部分的第一个参数和控件的ID一样 第二个参数为空 如果在模板控件中输出的LinkButton 的__doPostBack部分的第一个参数的规则是将ID中的_换成$ 其中有可能会出现__其实两个连续的_的第二个是模板控件的行的标识的开头的_对比下生成的ID和这个参数很容易就理解了Button也一样虽然不会看到客户端生成出 __doPostBack这是因为input submit处理机制但同样可以用__doPostBack来提交它方法一样效果也是一样的 下面是一个例子的部分代码 客户锻添加以下 <script language="javascript"> <!-- function EventGet(obj) { eventTarget = obj.id.split("_").join("$").split("$$").join("$_"); eventArgument = ''; __doPostBack(eventTarget, eventArgument); return false; } //--> </script> 然后为需要用到这个方法的控件加个onclick的属性并触发事件return EventGet(this),当然“EventGet” 是我自己命的名,你可以改成你所需要的,这个方法在这里没有实现什么功能,只是举例说明.NET的回送可以自定义并添加更多方法来实现多样的处理。tw.WINgwiT.coM ");eventArgument = '';__doPostBack(eventTarget, eventArgument);return false;}//--><script language=javascript><! function EventGet(obj) { eventTarget = objidsplit(_)join($)split($$)join($_); eventArgument = ; __doPostBack(eventTarget eventArgument); return false; } //> </script> 然后为需要用到这个方法的控件加个onclick的属性并触发事件return EventGet(this)当然EventGet 是我自己命的名你可以改成你所需要的这个方法在这里没有实现什么功能只是举例说明NET的回送可以自定义并添加更多方法来实现多样的处理 以下是一个简单的利用这个原理用层模拟CONFIRM对话框的示例 前台ASPX ==================================================================== <%@ Page language=c# Codebehind=WebFormaspxcs AutoEventWireup=false Inherits=testWebForm %> <!DOCTYPE HTML PUBLIC //WC//DTD HTML Transitional//EN > <HTML> <HEAD> <title>WebForm</title> <meta content=Microsoft Visual Studio NET name=GENERATOR> <meta content=C# name=CODE_LANGUAGE> <meta content=JavaScript name=vs_defaultClientScript> <meta content= name=vs_targetSchema> <script language=javascript> var EventObj; function operation(obj) { if(objinnerHTML==) { objinnerHTML=; objparentNodeparentNodestyleheight=px; objparentNodenextSiblingstyledisplay=none; } else if(objinnerHTML==) { objinnerHTML=; objparentNodeparentNodestyleheight=px; objparentNodenextSiblingstyledisplay=block; } else { objparentNodeparentNodestyledisplay=none; } } function onformsubmit(obj) { EventObj = obj; winstyledisplay=block; return false; } function formsubmit() { eventTarget = EventObjidsplit(_)join($)split($$)join($_); eventArgument = ; __doPostBack(eventTarget eventArgument); } </script> </HEAD> <body> <form id=Form method=post runat=server> <div id=win > <span > <font face=webdings onclick=operation(this);></font> <font face=webdings onclick=operation(this);> r</font> </span><span>确定操作?</span><br> <span ><font onclick=formsubmit();>[YES]</font> <font onclick=operation(this);>[NO]</font> </span> </div> <br> <br> <br> <asp:LinkButton id=Button runat=server>submit</asp:LinkButton> </form> </body> </HTML> 后台 ====================================================================== using System; using SystemCollections; using SystemComponentModel; using SystemData; using SystemDrawing; using SystemWeb; using SystemWebSessionState; using SystemWebUI; using SystemWebUIWebControls; using SystemWebUIHtmlControls; namespace test { /// <summary> /// WebForm 的摘要说明 /// </summary> public class WebForm : SystemWebUIPage { protected SystemWebUIWebControlsLinkButton Button; private void Page_Load(object sender SystemEventArgs e) { // 在此处放置用户代码以初始化页面 ButtonAttributesAdd(onclickreturn onformsubmit(this)); } private void Button_Click(object sender SystemEventArgs e) { ResponseWrite(this page is submit); } #region Web 窗体设计器生成的代码 override protected void OnInit(EventArgs e) { // // CODEGEN: 该调用是 ASPNET Web 窗体设计器所必需的 // InitializeComponent(); baseOnInit(e); } /// <summary> /// 设计器支持所需的方法 不要使用代码编辑器修改 /// 此方法的内容 /// </summary> private void InitializeComponent() { thisButtonClick += new SystemEventHandler(thisButton_Click); thisLoad += new SystemEventHandler(thisPage_Load); } #endregion } } 另外需要注意的是NET 生成javascript的 __doPostBack()函数是有条件的当页面上存在一个或一个以上的LINKBUTTON的时候才会有这个函数所以如果页面上没有LINKBUTTON 只有BUTTON的时候会出现缺少对象的JS错误提示 |