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

あるブロックreturn true;は、Web サービス呼び出し (数秒かかります) が終了して結果が返されたときに発生するものです。そこに何を置いても、btnSave_Click常にトリガーされます。(削除btnSave_Clickして に変更return true;するalert('test');と、アラートが発生します。)

btnSave_ClickWeb サービスが true を返したときにのみ強制的に起動するにはどうすればよいですか?

4

2 に答える 2

0

functionWebサービス呼び出しには、非同期呼び出しが戻ったときに実行されるコールバックメソッドがあります。

しかし、あなたのSaveChanges方法はそれまで待ちません。

これを行う1つの方法は、Webフォームに非表示のフィールドを含めるか、入力ボタンに追加の(独自の)属性を追加することです。webServiceを呼び出す前に、その値をコールバックメソッドで意味のある値に設定します。この値を確認してください。見つかった場合はtrueを返し、そうでない場合はwebServiceを呼び出してfalseを返します。

また、trueを返す代わりに、コールバックメソッドでjQueryまたはjavascriptを使用してボタンをクリックするコードを追加します。

このようなもの

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;
    }
}
于 2012-12-03T09:02:14.540 に答える
-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;
}
于 2012-12-03T08:04:58.387 に答える