日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

页面回传与js调用服务器端事件(转)

發(fā)布時(shí)間:2024/9/5 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 页面回传与js调用服务器端事件(转) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

第一章、?Asp.net中服務(wù)端控件事件是如何觸發(fā)的

Asp.net 中在客戶端觸發(fā)服務(wù)器端事件分為兩種情況:

一.?? WebControls中的Button 和HtmlControls中的Type為submit的HtmlInputButton

這兩種按鈕最終到客戶端的表現(xiàn)形式為:<input type="submit" value="Submit">,這是Form表單的提交按鈕,點(diǎn)擊以后會(huì)作為參數(shù)發(fā)送到服務(wù)端,參數(shù)是這樣的:

控件的name屬性=控件的value值,對(duì)應(yīng)上面的例子就是:Submit1= Submit。服務(wù)器端會(huì)根據(jù)接收到的控件的name屬性的這個(gè)key來得知是這個(gè)按鈕被點(diǎn)擊了,從而在服務(wù)端觸發(fā)這個(gè)按鈕的點(diǎn)擊事件。

二.?? HtmlControls 中的 Type為button的HtmlInputButton 和其它所有的控件事件,比如LinkButton點(diǎn)擊,TextBox的Change事件等等:

這些事件在客戶端產(chǎn)生后會(huì)經(jīng)過一個(gè)統(tǒng)一的機(jī)制發(fā)送到服務(wù)端。

?

1.首先asp.net頁框架會(huì)使用兩個(gè)Hidden域來存放表示是哪個(gè)控件觸發(fā)的事件,以及事件的參數(shù):

<!―表示觸發(fā)事件的控件,一般是這個(gè)控件的name -->

<input type="hidden" value="" />

<!―表示觸發(fā)事件的參數(shù),一般是當(dāng)某個(gè)控件有兩個(gè)以上的事件時(shí),用來區(qū)別是哪個(gè)事件 -->

<input type="hidden" value="" />

?

2.服務(wù)端會(huì)生成一個(gè)jscript的方法來處理所有這些事件的發(fā)送,這段代碼是:

<script language="javascript" type="text/javascript">

??? function __doPostBack(eventTarget, eventArgument)

??? {

??????? var theform = document.WebForm2;

??????? theform.__EVENTTARGET.value = eventTarget;

??????? theform.__EVENTARGUMENT.value = eventArgument;

??????? theform.submit();

??? }

</script>  

3.每個(gè)會(huì)引發(fā)服務(wù)端事件的控件都會(huì)在響應(yīng)的客戶端事件中調(diào)用上面的代碼:

比如,HtmlControls 中的 Type為button的HtmlInputButton的點(diǎn)擊事件

<!―客戶端的點(diǎn)擊事件調(diào)用__doPostBack,eventTarget 參數(shù)為'Button2',表示是name為'Button2’控件觸發(fā)的事件,eventArgument 為空,表示這個(gè)Type為button的HtmlInputButton只有一個(gè)客戶端觸發(fā)的服務(wù)端事件-->

<input language="javascript" Button2','')" type="button" value="Button" />

又比如,TextBox控件的Change事件

<!―客戶端的onchange事件調(diào)用__doPostBack,eventTarget 參數(shù)為’TextBox1’,表示是name為’TextBox1’控件觸發(fā)的事件,而TextBox控件只有一個(gè)客戶端觸發(fā)的服務(wù)端事件TextChanged,故服務(wù)器就會(huì)去觸發(fā)這個(gè)TextBox的TextChanged事件->

<input type="text" TextBox1','')" language="javascript" />

?

4.客戶端觸發(fā)事件后調(diào)用__doPostBack方法,將表示觸發(fā)的控件源的eventTarget 和事件參數(shù)eventArgument分別付給兩個(gè)隱藏域__EVENTTARGET和__EVENTARGUMENT,然后提交Form,在服務(wù)端根據(jù)__EVENTTARGET和__EVENTARGUMENT來判斷是哪個(gè)控件的什么事件觸發(fā)了。

?

第二章、?PostBack的原理

__doPostBack是一個(gè)純粹并且是非常簡單的javascript函數(shù),大部分的頁面PostBack都是由它觸發(fā)的。注意,這里是“大部分”,因?yàn)橹挥袃蓚€(gè)Web Server Control??? 會(huì)自己觸發(fā)頁面的PostBack,其它的所有控件都是通過__doPostBack函數(shù)觸發(fā)頁面的PostBack,那先來看一下這個(gè)函數(shù)的定義吧:

CODE1:

<input type="hidden" value="" />

<input type="hidden" value="" />

function __doPostBack(eventTarget, eventArgument) {

??? if (!theForm.onsubmit || (theForm.onsubmit() != false)) {

??????? theForm.__EVENTTARGET.value = eventTarget;

??????? theForm.__EVENTARGUMENT.value = eventArgument;

??????? theForm.submit();

??? }

}

通過上面的代碼可以看到,__doPostBack帶有兩個(gè)參數(shù),eventTarget是標(biāo)識(shí)將要引發(fā)頁面PostBack的控件ID,eventArgument參數(shù)提供了在引發(fā)頁面PostBack事件時(shí)所帶的額外參數(shù)。當(dāng)然這個(gè)函數(shù)被函數(shù)時(shí),這兩個(gè)參數(shù)的值將賦值給頁面的兩個(gè)隱含變量__EVENTTARGET和__EVENTARGUMENT,然后調(diào)用頁面的submit方法提交頁面表單。這就是為什么我們可以通過Request.Form[“__EVENTTARGET”]獲取得到引發(fā)頁面PostBack的控件ID的原因。

了解了__doPostBack函數(shù)后,我們可以很容易的利用它非常方便地自己觸發(fā)自定義的PostBack事件。那上面也說了,大部分的控件都是調(diào)用

?

第三章 Button PostBack做法

引了頁面的PostBack,只有兩個(gè)控件是例外,Button 和 ImageButton,正是因?yàn)樗鼈儾皇峭ㄟ^調(diào)用__doPostBack來回發(fā)事件,所以通過表單隱含變量__EVENTTARGET和__EVENTARGUMENT是無法獲取得到引發(fā)PostBack的Button或ImageButton的ID和參數(shù)值的,可通過下面的方式實(shí)現(xiàn)

1)在頁面中加如 LinkButton ,頁面就會(huì)在頁面中加載POSTBACK所需的JS

<input type="hidden" value="" />

<input type="hidden" value="" />

function __doPostBack(eventTarget, eventArgument) {

??? if (!theForm.onsubmit || (theForm.onsubmit() != false)) {

??????? theForm.__EVENTTARGET.value = eventTarget;

??????? theForm.__EVENTARGUMENT.value = eventArgument;

??????? theForm.submit();

??? }

}?

2)利用GetPostBackEventReference給客戶端生成__doPostBack()
如:

比如前臺(tái)頁面

<asp:Button id="Button1" runat="server" Text="Button"></asp:Button>

(1)

<a href="#" onclick="document.getElementById('Button1').click()">觸發(fā)服務(wù)器端按鈕事件</a>

(2)

利用GetPostBackEventReference給客戶端生成__doPostBack()
前臺(tái)

<a href="#" onclick="<%=PostBack()%>">觸發(fā)服務(wù)器端按鈕事件</a>

后臺(tái)

protected string PostBack()

{

??? return this.Page.GetPostBackEventReference(this.Button1,"haha");

}

通過__EVENTARGUMENT="haha"可以判斷是不是點(diǎn)了那個(gè)鏈接的PostBack把Button1的按鈕事件這么寫:

if (Request["__EVENTARGUMENT"] == "haha")

{

??? Response.Write("這個(gè)是鏈接的PostBack");

}

else

{

??? Response.Write("這個(gè)不是鏈接的PostBack");

}

?

Bug

問題:『使用__doPostBack會(huì)導(dǎo)致』

回發(fā)或回調(diào)參數(shù)無效。在配置中使用 <pages enableEventValidation="true"/> 或在頁面中使用 <%@ Page EnableEventValidation="true" %> 啟用了事件驗(yàn)證。出于安全目的,此功能驗(yàn)證回發(fā)或回調(diào)事件的參數(shù)是否來源于最初呈現(xiàn)這些事件的服務(wù)器控件。如果數(shù)據(jù)有效并且是預(yù)期的,則使用 ClientScriptManager.RegisterForEventValidation 方法來注冊(cè)回發(fā)或回調(diào)數(shù)據(jù)以進(jìn)行驗(yàn)證。

問題分析及解決方案:『來源網(wǎng)絡(luò)』

這個(gè)要具體分析。本來這個(gè)措施是asp.net2.0用來防止客戶端“欺詐”服務(wù)器端的。例如本來輸出到客戶端的一個(gè)事件被觸發(fā)時(shí)需要回發(fā)的命令是“__doPostback('ctl01$abc','user_1')”的,如果采取采取手段把回發(fā)參數(shù)由 user_1 改為 user_5 了,服務(wù)器端會(huì)重新核對(duì)輸出的是不是user_5,發(fā)現(xiàn)和這個(gè)頁面上一個(gè)輸出的腳本不一致,就會(huì)產(chǎn)生這個(gè)異常。

但是,很多程序員寫的程序按照過去的習(xí)慣(或者按照更加高級(jí)靈活的設(shè)計(jì)例如一些Ajax組件)沒有考慮這個(gè)問題或者是忽略這個(gè)欺詐的可能性,寫的程序可能會(huì)修改參數(shù)或者修改目標(biāo)控件。

因此這樣具體問題具體分析。不太可能跟瀏覽器距離服務(wù)器的遠(yuǎn)近有關(guān),應(yīng)該還是編程邏輯問題。你應(yīng)該對(duì)出異常的畫面以及所使用的數(shù)據(jù)進(jìn)行分析。有時(shí)候,經(jīng)常也需要將這個(gè)參數(shù)設(shè)置為false,放棄安全管理

轉(zhuǎn)載于:https://www.cnblogs.com/iammrwu/archive/2012/02/08/2343060.html

總結(jié)

以上是生活随笔為你收集整理的页面回传与js调用服务器端事件(转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。