2010-11-09 67 views
0

我試圖找出如何實現以下目標:ASP.NET AJAX - 的ScriptManagerProxy和處理HTML按鈕點擊

    按鈕
  • 處理客戶端的單擊事件 - 防止回發,如果javascript調用的結果爲假(例如onclick="js:return IsThisAllowed()"
  • Javascript方法將返回真或假,這取決於使用的ScriptManagerProxy
  • 調用生成web服務方法的結果

下面的代碼被簡化至我指至i主要部件這個問題。我可以alert()返回值沒有問題,但是我遇到問題的部分是如何將Web服務方法調用的結果返回給按鈕onclick處理程序?由於函數Finish()在我假設爲XmlHttp.send()調用成功時在單獨的線程中調用,因此如何將響應的值作爲javascript方法的返回值發送?我是否全部錯了?

我已經使用類似的代碼多次用返回值更新DOM,比如在<div>之內,但從來不必擔心捕獲返回值並在腳本中使用它。

我到目前爲止有:

.NET Web服務方法(VB.NET):爲頁面生成AJAX的Web服務方法

<WebMethod()> _ 
<ScriptMethod()> _ 
Public Function IsAllowed() As Boolean 
    Return True 
End Function 

.NET代碼和HTML按鈕

<asp:ScriptManagerProxy ID="ScriptManagerProxy1" runat="server"> 
    <Services> 
     <asp:ServiceReference Path="~/WebServices/MyWebService.asmx" /> 
    </Services> 
</asp:ScriptManagerProxy> 
<asp:Button ID="_btn" runat="server" OnClientClick="js:return IsAllowed();" /> 

的Javascript

回答

2

你不能這樣做:對web服務的調用是一個對服務器的異步請求,它立即將控制權交還給客戶端 - 而且你的javascript在請求完成之前(幾乎)總是會完成執行(最有可能之前該請求甚至交付)。

由於您不知道何時會收到致電ws.IsAllowed的回覆,因此您需要在回叫中處理該回復(FinishError)。

(這是真的你使用任何AJAX機制。)

我不熟悉不夠與基於ScriptManager的-AJAX來告訴你究竟如何做到這一點,但總的想法是,我'轉向它:而不是取消ASP.NET按鈕的單擊事件,我只會觸發ASP.NET按鈕,如果AJAX調用返回true。

使用jQuery,我會通過從香草HTML按鈕(而不是ASP.NET Web控件)進行AJAX調用。在成功處理程序(相當於Finish)中,當返回值爲true時,會觸發我的ASP.NET按鈕(我可能會隱藏)。

+0

是的,這是我的經驗,但你有什麼建議來完成我想要做的? – Keith 2010-11-09 21:34:55

+1

我想我想出了你要完成的任務 - 取消ASP。NET回發基於Web服務調用的結果。我正在用解決方案更新我的答案。 – 2010-11-09 21:35:53

+0

準確地說 - 我已經有click事件中的邏輯來阻止處理(並拋出錯誤),如果不允許調用,但我寧願沒有完整的回發開銷,如果我能完成這個Ajax-樣式。 – Keith 2010-11-09 21:38:38

0

你有沒有考慮過使用jQuery?

$.ajax({ 
    type: "POST", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    url: "~/WebServices/IsAllowed.asmx/{Method Name}", 
    data: ('{ whatever data is needed for decision making json serialized }'), 
    success: function (msg) { 
     alert(msg); 
      }, 
    error: function (request, status, error) { 
        alert(err.Message); 
        alert(err.StackTrace); 
    } 
}); 
+0

兩者都會達到完全相同的結果 - 成功後,我仍然無法將回調的結果返回給onclick處理程序。 – Keith 2010-11-09 21:33:07