熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

自定義回送處理的方法

2013-11-13 10:26:24  來源: .NET編程 

  

  在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>&nbsp;&nbsp;&nbsp;<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錯誤提示


From:http://tw.wingwit.com/Article/program/net/201311/13622.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.