【问题标题】:ASP.NET Button, executing OnClick only if OnClientClick returns trueASP.NET 按钮,仅当 OnClientClick 返回 true 时才执行 OnClick
【发布时间】:2012-11-20 16:20:25
【问题描述】:

我有一个看起来像这样的按钮:

<asp:Button ID="btnSave" runat="server" CssClass="SubmitButton" Text="Order >>" OnClientClick="return SaveChanges();" OnClick="btnSave_Click" />

一个看起来像这样的 javascript 函数:

function SaveChanges() {
    var success = false;

    var arr1 = new Array();
    var arr2 = new Array();
    var arr3 = new Array();
    for (var i = 0; i < self.frames.length-1; i++) {
        arr1[i] = document.getElementById("frame" + i.toString()).contentWindow.getFramePSFID();
        arr2[i] = document.getElementById("frame" + i.toString()).contentWindow.getFrameHeading();
        arr3[i] = document.getElementById("frame" + i.toString()).contentWindow.saveSvg();
    }

    Scripts.WebServices.WSCommon.SaveChanges(arr1, arr2, arr3, function (result) {
        return true;
    });
}

return true; 所在的块是 Web 服务调用(需要几秒钟)完成并返回结果后发生的情况。不管我放什么,btnSave_Click 总是会触发。 (如果我删除 btnSave_Click 并将 return true; 更改为 alert('test');,则会触发警报。

我需要做些什么来强制btnSave_Click 仅在 Web 服务返回 true 时触发?

【问题讨论】:

标签: javascript asp.net web-services


【解决方案1】:

你的webservice调用中的function是异步调用返回时要执行的回调方法..

但是您的SaveChanges 方法不会等到那时。

我认为您可以做到这一点的一种方法是在您的网络表单中添加一个隐藏字段或向您的输入按钮添加一个额外的(您自己的)属性。在回调方法中将其值设置为某个有意义的值。之前调用 webService 检查这个值。如果找到返回 true,否则调用你的 webService 并返回 false。

并且还添加代码以在回调方法中使用 jQuery 或 javascript 来单击您的按钮,而不是返回 true..

类似的东西

function SaveChanges() {

   //your array code..

    if (<check_your_hidden_field_value>){
        return true;
    }else{
        Scripts.WebServices.WSCommon.SaveChanges(arr1, arr2, arr3, function (result) {

            //set your hiddenfield data here..

            document.getElementById('<%= btnSave.ClientID %>').click();//click button
        });
        return false;
    }
}

【讨论】:

    【解决方案2】:

    对SaveChanges() 稍作调整怎么样:

    function SaveChanges() {
        var success = false;
    
        var arr1 = new Array();
        var arr2 = new Array();
        var arr3 = new Array();
        for (var i = 0; i < self.frames.length-1; i++) {
            arr1[i] = document.getElementById("frame" + i.toString()).contentWindow.getFramePSFID();
            arr2[i] = document.getElementById("frame" + i.toString()).contentWindow.getFrameHeading();
            arr3[i] = document.getElementById("frame" + i.toString()).contentWindow.saveSvg();
        }
    
        Scripts.WebServices.WSCommon.SaveChanges(arr1, arr2, arr3, function (result) {
            success = true;
            btnSave_Click();
        });
    
        return success;
    }
    

    【讨论】:

    • btnSave_Click() 在服务器端处理
    • 不行,总是返回false,必须在SaveChanges函数作用域外声明成功
    • @user982119 我认为 Yohanes 的解决方案几乎没问题。只是一个小小的改变。 Scripts.WebServices.WSCommon.SaveChanges(arr1, arr2, arr3, function (result) { success = true; document.getElementById('').click(); });如果(!成功){返回假; } 其他 { 成功 = 假;返回真; }
    • 欣赏评论,但这并不能解决问题。您的建议会造成无限循环。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多