代码之家  ›  专栏  ›  技术社区  ›  Keith

ASP.NET AJAX-ScriptManagerProxy和处理html按钮单击

  •  0
  • Keith  · 技术社区  · 14 年前

    我在想如何做到以下几点:

    • onclick="js:return IsThisAllowed()" )
    • Javascript方法将返回true或false,具体取决于使用ScriptManagerProxy调用生成的web服务方法的结果

    我以前多次使用类似的代码用返回值更新DOM,例如 <div> ,但不必担心捕获返回值并在脚本中使用它。

    到目前为止我所拥有的:

    .NET web服务方法(VB.NET):

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

    <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

    <script type="text/javascript">
        function IsAllowed(orderid) {
            if (!processing) {
                processing = true;
    
                var ws = new MyWebService();
                ws.IsAllowed(Finish, Error)
    
                // return TRUE if call to IsAllowed returns true!!!
    
                return false;
            }
        }
    
        function Finish(result) {
            alert(result)
        }
    
        function Error() {
        }
    
    </script>
    
    2 回复  |  直到 14 年前
        1
  •  2
  •   Jeff Sternal    14 年前

    您不能这样做:对web服务的调用是对服务器的异步请求,它会立即将控制权返回给客户端,而javascript(几乎)总是在请求完成之前(很可能在请求被传递之前)完成执行。

    因为你不知道什么时候会收到 ws.IsAllowed ,你需要在回拨时处理它( Finish Error

    (无论您使用的是什么AJAX机制,这都是正确的。)

    我不太熟悉基于ScriptManager的AJAX 确切地 如何做到这一点,但一般的想法是,我会扭转局面:如果AJAX调用返回true,我不会取消ASP.NET按钮的单击事件,而是只触发ASP.NET按钮。

    完成 ),当返回值为true时,我将触发我的ASP.NET按钮(可能会隐藏)。

        2
  •  0
  •   light    14 年前

    $.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);
        }
    });