【问题标题】:ASP.NET AJAX - ScriptManagerProxy and handling html button clicksASP.NET AJAX - ScriptManagerProxy 和处理 html 按钮点击
【发布时间】:2011-05-07 12:40:07
【问题描述】:

我正在尝试弄清楚如何完成以下任务:

  • 处理按钮的客户端单击事件 - 如果 javascript 调用的结果为 false(例如 onclick="js:return IsThisAllowed()"),则防止回发
  • Javascript 方法将返回 true 或 false,具体取决于使用 ScriptManagerProxy 调用生成的 Web 服务方法的结果

下面的代码被简化为我在这个问题中提到的主要组件。我可以 alert() 返回值没问题,但我遇到问题的部分是如何将 Web 服务方法调用的结果返回给按钮 onclick 处理程序?由于函数 Finish() 在我假设是 XmlHttp.send() 调用成功后在单独的线程中被调用,我如何将响应的值作为 javascript 方法的返回值发送?我是不是搞错了?

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

到目前为止我所拥有的:

.NET 网络服务方法(VB.NET):

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

.NET 代码为页面生成 AJAX web 服务方法,以及 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

<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>

【问题讨论】:

    标签: javascript asp.net ajax asp.net-ajax xmlhttprequest


    【解决方案1】:

    您不能这样做:对 Web 服务的调用是对服务器的异步请求,该请求会立即将控制权返回给客户端 - 您的 javascript(几乎)总是会在请求完成之前完成执行(很可能在请求甚至交付之前)。

    由于您不知道何时会收到对 ws.IsAllowed 的调用的响应,因此您需要在回调中处理它(FinishError)。

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

    我对基于 ScriptManager 的 AJAX 不够熟悉,无法确切地告诉您如何执行此操作,但总体思路是我会转过身来:而不是取消 ASP.NET按钮的单击事件,如果 AJAX 调用返回 true,我只会触发 ASP.NET 按钮。

    使用 jQuery,我将通过从普通 HTML 按钮(不是 ASP.NET Web 控件)进行 AJAX 调用来实现。在成功处理程序(相当于Finish)中,当返回值为真时,我会触发我的 ASP.NET 按钮(我可能会隐藏它)。

    【讨论】:

    • 是的,这就是我所经历的,但是你有什么建议来完成我想要做的事情吗?
    • 我想我知道你想要完成什么 - 根据 Web 服务调用的结果取消 ASP.NET 回发。我正在用解决方案更新我的答案。
    • 完全正确 - 如果不允许调用,我已经在 click 事件中设置了防止处理(并引发错误)的逻辑,但我宁愿没有完整回发的开销如果我能完成这种 Ajax 风格。
    • 我熟悉 jQuery 和触发 click() 事件,但是在 click 事件本身中处理这个不会导致堆栈溢出吗?无论如何我都会尝试一下,看看我得到了什么。
    • 对不起,如果我不清楚:我建议您使用 两个按钮。一个可见按钮启动 AJAX 调用。另一个按钮(可能不可见)是一个 ASP.NET 按钮,它实际提交表单(并在您的代码隐藏中调用处理程序)。
    【解决方案2】:

    你考虑过使用 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);
        }
    });
    

    【讨论】:

    • 两者都将完成完全相同的结果 - 如果成功,我仍然无法将调用结果返回给 onclick 处理程序。
    猜你喜欢
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多