標籤:
c#後台調用前台與js方法互調分類: 每天學一點2009-10-22 00:32 1527人閱讀 評論(0) 收藏 舉報c#javascript指令碼buttonvbscriptstring
很多人都向在伺服器端調用用戶端的函數來操作,也就是在asp中調用javascript指令碼中已經定義好的指令碼函數。經過研究,發現了一些勉強的方法。
1. 用Response.Write方法寫入指令碼
比如在你單擊按鈕後,先操作資料庫,完了後顯示已經完成,可以在最後想調用的地方寫上
Response.Write("<script type=‘text/javascript‘>alert();</script>");
這個方法有個缺陷就是不能呼叫指令碼檔案中的自訂的函數,只能調用內建函式,具體調用自訂的函數只能在Response.Write寫上函數定義,比如Response.Write("<script type=‘text/javascript‘>function myfun(){...}</script>");
2.用ClientScript類動態添加指令碼
用法如下:在想調用某個javascript指令碼函數的地方添加代碼,注意要保證MyFun已經在指令檔中定義過了。
ClientScript.RegisterStartupScript(ClientScript.GetType(), "myscript", "<script>MyFun();</script>");
這個方法比Response.Write更方便一些,可以直接呼叫指令碼檔案中的自訂函數。
3.普通的添加控制項的Attributes屬性
對於普通按鈕就是:Button1.Attributes.Add("onclick","MyFun();");
只能在Onload中或類似於onload的初始化過程中添加才有效。而且是先執行指令碼函數,無法改變執行順序。
注意,以上所有方法中,後台代碼都不能有轉化當前頁的代碼,比如Redirect等,要把轉頁代碼放在指令碼裡面
問:
1.如何在JavaScript訪問C#函數?
2.如何在JavaScript訪問C#變數?
3.如何在C#中訪問JavaScript的已有變數?
4.如何在C#中訪問JavaScript函數?
問題1答案如下:
javaScript函數中執行C#代碼中的函數:
方法一:1、首先建立一個按鈕,在後台將調用或處理的內容寫入button_click中;
2、在前台寫一個js函數,內容為document.getElementById("btn1").click();
3、在前台或後台調用js函數,激發click事件,等於訪問後台c#函數;
方法二:1、函式宣告為public
後台代碼(把public改成protected也可以)
public string ss()
{
return("a");
}
2、在html裡用 <%=fucntion()% >可以調用
前台指令碼
<script language=javascript >
var a = " <%=ss()% >";
alert(a);
</script >
方法三:1、 <script language="javascript" >
<!--
function __doPostBack(eventTarget, eventArgument)
{
var theForm = document.Form1; //指runat=server的form
theForm.__EVENTTARGET.value = eventTarget;
theFrom.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
-- >
</script >
<input id="Button1" type="button" name="Button1" value="按鈕" onclick="javascript:__doPostBack( ‘Button1 ‘, ‘ ‘)" >
方法四: <script language="javascript" >
function SubmitKeyClick()
{
if (event.keyCode == 13)
{
event.cancelBubble = true;
event.returnValue = false;
document.all.FunName.value="你要調用的函數名";
document.form[0].submit();
}
}
</script >
<INPUT onkeypress="SubmitKeyClick()" id="aaa" type="text" >
<input type="hidden" name="FunName" > 〈!--用來儲存你要調用的函數 --〉
在.CS裡有:
public Page_OnLoad()
{
if (!Page.IsPost())
{
string strFunName=Request.Form["FunName"]!=null?Request.Form["FunName"]:"";
//根據傳回來的值決定調用哪個函數
switch(strFunName)
{
case "enter()":
enter() ; //調用該函數
break;
case "其他":
//調用其他函數
break;
default:
//調用預設函數
break;
}
}
}
public void enter()
{
//……比如計算某值
}
問題2.如何在JavaScript訪問C#變數?
答案如下:
方法一:1、通過頁面上隱藏欄位訪問 <input id="xx" type="hidden" runat="server" >
方法二:1、如後台定義了PUBLIC STRING N;前台js中引用該變數的格式為 ‘ <%=n% > ‘或"+ <%=n% >+"
方法三:1、或者你可以在伺服器端變數賦值後在頁面註冊一段指令碼
" <script language= ‘javascript ‘ >var temp=" + tmp + " </script >"
tmp是後台變數,然後js中可以直接存取temp獲得值。
3.如何在C#中訪問JavaScript的已有變數?
答案如下:
方法一:1、前台使用靜態文本控制項隱藏欄位,將js變數值寫入其中;
2、後台用request["id"]來擷取值;
方法二:可以用cookie或session
4.如何在C#中訪問JavaScript函數?
答案如下:
c#代碼中執行javaScript函數:
方法一:1、Page.RegisterStartupScript("ggg"," <script >SetVisible(1); </script >");
方法二:使用Literal類,然後
private void Button2_Click(object sender, System.EventArgs e)
{
string str;
str=" <script language= ‘javascript ‘ >";
str+="selectRange()";
str+=" </script >";
//Literal1.Visible=true;
Literal1.Text=str;
}
1.後台方法:
protected string CsharpVoid(string strCC)
{
return strCC;
}
2.javascript 調用
<script>
var s = "<%=CsharpVoid("<a href="http://www.esoutong.com")%/">www.esoutong.com")%>";
document.write(s);
</script>
+++++++++++++++++第二種情況:
1.後代碼:
protected void CsharpVoid()
{
string strCC = "www.esoutong.com";
Response.Write(strCC);
}
2.調用方法:CsharpVoid()
<script>
document.write("<%CsharpVoid();%>");
</script>
你可在頁面中放一個按鈕,把它設定為不可見style="display:none",然後,用指令碼讓此按鈕點擊
document.all("button1").click();
在此按鈕的C#後台中寫事件代碼,這就是最簡單的指令碼調用C#方法.
在網上看到這樣一個問題:作者用的平台是.NET,用C#在本機開發,在aspx檔案中調用 js檔案:
<script language="javascript" src="mymenu.js"></script>
結果在頁面及 alert 提示的中文均為亂碼,求解決辦法。結果後面跟貼給出一長串的解決辦法,其實很簡單,在aspx 檔案的頭部添加一行代碼即可:
<!--Page ContentType="text/html" ResponseEncoding="gb2312"-->
很簡單吧,呵呵。<!--page ContentType="text/html" ResponseEncoding="gb2312"--> <script language="javascript" type="text/javascript" src="TreeView.js"></script><script language="javascript" type="text/javascript" src="TreeView.js"></script>
--------------------------------------------------------------------------------------------------------------------------------------------------
在C#中調用VBScript、JavaScript等指令碼的實現
秋楓
以前在做工作流程(workflow)項目的時候,裡面有一項就是在使用者制定流程定義時可以編寫指令碼來控制活動的跳轉,而這些指令碼定義後存在資料庫中,當流程啟動的時候,工作流程引擎會控制活動執行順序,串型的兩個活動比較簡單,但有的活動到下一個活動有條件判斷,或者存在多個分支,簡單的還好,只要在資料庫表中加個欄位就可以實現,複雜一點的就需要通過指令碼實現了。當時經驗不夠,幾天都沒找到快速的解決辦法,想自己寫一個自訂指令碼引擎沒有把握,而且時間也不夠,還是在網上找找看吧,花了一些時間,還是找到了一個自認為比較好的解決辦法,寫出來同大家分享。
下面通過兩部分來說明實現以及應用。
一.使用MSScriptControl
到微軟的網站上下載Windows Script Control,它是一個ActiveX(R) 控制項,所以在.NET中使用我Interop了一下。下載安裝完成後,建立一個C#的Windows應用程式項目,在方案總管中選中引用節點,右鍵點擊選擇添加引用菜單,彈出添加引用對話方塊,單擊瀏覽找到安裝Windows Script Control的目錄,選取msscript.ocx檔案確定。那麼在引用節點下會增加一個MSScriptControl組件,下面是他Interop後的所有對象。
ScriptControl 對支援 ActiveX(TM) Script 的宿主 Script 引擎提供簡單介面。接下來我們對被轉化成ScriptControlClass類的ScriptControl的屬性和方法進行一些說明。
屬性
AllowUI 屬性:應用於 ScriptControl 本身或 Scirpt 引擎顯示的使用者介面元素,可讀寫。
CodeObject 屬性:返回對象,該對象用於調用指定模組的公用成員。唯讀。
Error 屬性:返回 Error 對象,其中包含所發生的最後一個錯誤的相關詳細資料。唯讀。
Language 屬性:設定或返回正在使用的 Script 語言名稱。可讀寫。
Modules 屬性:為 ScriptControl 對象返回模組集合。唯讀。
Procedures 屬性:返回在指定模組中已定義流程集合。唯讀。
SitehWnd 屬性:設定或返回視窗的 hWnd,通過執行 Script 代碼,此視窗用於顯示對話方塊和其他使用者介面元素。可讀寫。
State 屬性:設定或返回 ScriptControl 對象的模式。可讀寫。
Timeout 屬性:設定或返回時間(毫秒),此時間後使用者可選擇中止 Script 代碼的執行或允許代碼繼續執行。可讀寫。
UseSafeSubset 屬性:設定或返回 Boolean 值,指明宿主應用程式是否有保密性要求。如果宿主應用程式需要安全控制,則 UseSafeSubset 為 True,否則為 False。可讀寫。
方法
AddCode 方法:向模組添加指定代碼。可多次調用 AddCode 方法。
AddObject 方法:使主機物件模型對 Script 引擎可用。
Eval 方法:計算運算式並返回結果。
ExecuteStatement 方法:執行指定的語句。
Reset 方法:放棄所有已經添加到 ScriptControl 中的 Script 代碼和對象。
Run 方法:運行指定過程。
事件
Error 事件:出現執行階段錯誤時,發生此事件。
Timeout 事件:當超出了 Timeout 屬性指定的時間且使用者在結果對話方塊中選定了 End 時,發生此事件。
補充幾點
AllowUI 屬性如果設定為false,則顯示對話方塊之類的語句不起作用,如在 VBScript 中MsgBox 語句,JavaScript中的alert等,並且如果執行的指令碼超出TimeOut設定的毫秒數,也不會跳出超出時間提醒的對話方塊,反之則相反;重新設定 Language 屬性會清空AddCode載入的代碼;對於TimeOut屬性,發生逾時時,ScriptControl 檢查對象的 AllowUI 屬性,確定是否允許顯示使用者介面元素。
c#後台調用前台與js方法互調