c#中JavaScript與後臺代碼的相互調用

c#中JavaScript與後臺代碼的相互調用


問題描述:

在後臺代碼中,需要彈出一個對話框,讓用戶選擇確定或者取消,用的是confirm。接下來的代碼需要根據用戶的選擇情況進行調用。

這裏就涉及到怎麼取到confrim值的問題。

首先我想到的是,在Response.write()裏面寫confrim,它的返回值無法直接賦給後臺代碼的變量,就在前臺加了一個輔助用的文本框,通過它的id號在JavaScript中給它賦值,然後在後臺代碼中通過id取值。很不幸,在Response.write()裏面寫的語句如果除了內部函數(如alert(),confirm())還有其他的語句,比如賦值的語句,它就不執行了。

第二,還是使用Response.write()。準備在Response.write()裏面直接調用前臺定義的JavaScript的函數。這個方法也不行,用Response.write()調用JavaScript的方法,這個方法只能是它內部的函數,自己定義的函數是不行的。

第三,放棄Response.write()。使用ClientScript.RegisterStartupScript(ClientScript.GetType(), "myscript", "<script>函數名();</script>");這個方式是能調用自己定義的JavaScript的方法,當然“函數名()”要求是已經是定義過的。確定能調用這個方法後,準備如原先想的那樣,通過id去取輔助用的文本框的值。這時候就發現,又出現了另外一個問題。通過ClientScript.RegisterStartupScript的方式是能調用自定義的腳本方法了,但是它的調用是發生在服務器代碼執行完之後。也就是說,預想的執行順序是,ClientScript.RegisterStartupScript--立即調用腳本方法--取得文本框的值--根據取到的值判斷接下來要執行的服務器端代碼。而實際順序是,ClientScript.RegisterStartupScript--取得文本框的值(沒變)--根據文本框的值判斷接下來要執行的服務器端代碼--調用腳本方法。結論,更改原先的設想,改爲:通過ClientScript.RegisterStartupScript調用自定義腳本方法,在腳本方法裏獲取到用戶的反饋信息,根據不同信息,在腳本里調用服務器的代碼。

問題變爲怎樣在腳本里調用後臺代碼。

1.使用document.write("<%方法名()%>");使用這種方式的結果是,後臺的“方法名()”方法被多次調用,不清楚document.write()做了什麼,對方法的作用域、觸發時機有什麼影響。

2.將要調用的後臺代碼作爲前臺按鈕事件處理方法。在腳本里通過調用按鈕事件去調用後臺代碼。可行。

綜上所述,爲了能在後臺加一個confirm並且根據它的返回值決定接下來的流程,首先要在後臺使用ClientScript.RegisterStartupScript調用JavaScript的方法,然後在頁面上添加一個輔助用的按鈕,再把根據confirm返回值的不同而要執行的後臺代碼作爲按鈕的事件處理方法,最後,在JavaScript方法裏調用按鈕的事件處理方法。

代碼要實現的功能是:檢查數據庫裏是否已有某條記錄,如果已經有,彈出confrim框讓用戶選擇是否更改記錄。如果點擊確定,進行數據庫更新操作。部分代碼如下:

一、後臺代碼

 

  1. string sql = "select * from LossInfo where 線路名稱='" + lineName + "' and 年份 ='" + strYear + "' and 月份='"+strMonth+"'";  
  2.             string result=PowerGisDB.GetFirstData(sql);//執行查詢語句  
  3.             if (result != "")  
  4.             {  
  5.                 //在服務器端調用JavaScript代碼  
  6.                 ClientScript.RegisterStartupScript(ClientScript.GetType(), "myscript""<script>houtai();</script>");  
  7.             }  
  8.  

二、前臺JavaScript

  1. function houtai()  
  2.     {  
  3.          var isUpdate=confirm("已存在該線路線損記錄是否更新");  
  4.         if(isUpdate)//調用後臺方法  
  5.         {  
  6.                    document.getElementById("Buttonfz").click();  
  7.         }  
  8.     }  

 

增加的輔助按鈕

 

  1. <asp:Button ID="Buttonfz" runat="server" Text="Button" OnClick="Button1_Click"/> 

三、後臺事件處理方法:

 

  1. protected void Button1_Click(object sender, EventArgs e)  
  2.    {  
  3.        MyUpdate();//進行數據庫更新操作  
  4.    } 

附加:對於輔助按鈕,爲了避免用戶單擊引發click事件,要把它設爲不可見。但是如果設置了不可見,腳本中也無法調用這個事件了。解決方法:在前臺首先將按鈕的visible屬性設置false,然後在 ClientScript.RegisterStartupScript之前,將它改爲true,MyUpdate()之後再改回false。

注:其實更簡單的方法是把輔助按鈕的width設成0就行了。

如果是html的按鈕,除了onclick事件要改爲onserverclick以外,對於visible的設置可以使用這種方式:style="display:none".

補加例子,使用html的input按鈕。

前臺aspx代碼

 

  1. <p>隱藏按鈕上一行</p>  
  2.            <input type="button" id="ButtonHidden2" runat="server" value="myHidden" style="display:none" onserverclick="ButtonHidden_Click" />  
  3.        <p>隱藏按鈕下一行</p> 

後臺cs代碼

 

  1. protected void Page_Load(object sender, EventArgs e)  
  2.     {  
  3.         if (!Page.IsPostBack)  
  4.         {  
  5.             ClientScript.RegisterStartupScript(ClientScript.GetType(), "myscript""<script>myinput();</script>");  
  6.         }  
  7.     }  
  8.     protected void ButtonHidden_Click(object sender, EventArgs e)  
  9.     {  
  10.         int i = 0;  
  11.         i++;  
  12.         Response.Write("i="+i);  
  13.     }  
  14.  

JavaScript代碼:

 

  1. <script language="javascript" type="text/javascript">  
  2.    function myinput()  
  3.    {   
  4.       document.getElementById("ButtonHidden2").click();  
  5.    }   
  6.    </script>  
  7.  

運行顯示結果:

i=1

隱藏按鈕上一行

隱藏按鈕下一行

注意:如果在input按鈕裏面有 fun();",事件就不繼續往下執行了,將return關鍵字去掉,會繼續往下執行。

/r/n/n本文來自CSDN博客,轉載請標明出處:http://www.flatws.cn/article/program/javascript/2010-08-26/10894.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章