ASP.NET按钮,仅在OnClientClick返回true时执行OnClick。

3

我有一个长这样的按钮:

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

当web服务调用完成并返回结果时,return true;所在的块是发生的地方。无论我在那里放什么,btnSave_Click总是会触发。(如果我删除btnSave_Click并将return true;更改为alert('test');,则警报会触发。)

我需要做什么才能强制btnSave_Click仅在web服务返回true时触发?


请参考以下问题:https://dev59.com/2msz5IYBdhLWcg3w3btb - karaxuna
2个回答

0

function在您的Web服务调用中是一个回调方法,当异步调用返回时将执行该方法。

但是您的SaveChanges方法不会等待此操作完成。

我认为解决这个问题的一种方法是,在您的Web表单中添加一个隐藏字段或者添加一个额外的(自己的)属性到您的输入按钮上。在回调方法中设置它的值为一些有意义的值,在调用Web服务之前检查这个值。如果找到了这个值,则返回true,否则调用您的Web服务并返回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;
    }
}

-1

对于 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() 是在服务器端处理的。 - notAnonymousAnymore
它不会起作用,它总是返回false,你必须在SaveChanges函数的范围之外声明成功。 - karaxuna
@user982119 我认为Yohanes的解决方案几乎没问题。只需要做一个小改动。Scripts.WebServices.WSCommon.SaveChanges(arr1, arr2, arr3, function (result) { success = true; document.getElementById('<%= btnSave.ClientID %>').click(); }); 如果(!success) { 返回 false; } 否则 { success = false; 返回 true; } - Teddy
感谢您的评论,但它并没有解决问题。您所建议的会创建一个无限循环。 - notAnonymousAnymore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接