0

ASP.NETにボタンがあります。ユーザーがボタンをクリックしたときに、事前に検証を行いたいので、検証メソッドがtrueを返した場合にのみポストバックが発生します。

私の考えは、ボタンのOnClientClickのロジックを使用することでした。OnClientClick = "return false;"と言うと、ポストバックは返されませんが、trueは返されます。ただし、結果として生じる動作は、jQueryメソッドが返したものであっても、ポストバックを作成しないため、これは機能していません。

現在私は持っています:

マークアップ:

<asp:Button runat="server" ID="ReplyBtn" OnClientClick="return ValidateInput();" OnClick="ReplyBtn_Click" CssClass="btn-large btn-success"
    Text="Answer" />

JavaScript:

function ValidateInput() {
        var value = stripHtml(CKEDITOR.instances['ReplyBox'].getData()).trim();
        var options = {
            type: "POST",
            url: "../../Services/ForumOperationService.svc/ReplyToPostFeedback",
            data: '{"content":"' + value + '"}',
            async: false,
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(msg) {
                $("#StatusReplyLbl").text(msg.ReplyToPostFeedbackResult);

                if (msg.ReplyToPostFeedbackResult) {
                    return false;
                } else {
                    return true;
                }

            },
            error: function () {
                return true;
            }
        };
        $.ajax(options);
        return false;
    }

    function stripHtml(str) {
        return $('<div />', { html: str }).text();
    }

それで、基本的に、このコードの何が問題になっていますか?また、ポストバックを作成する前に、ボタンの検証を実行するにはどうすればよいですか?

4

3 に答える 3

4

falseajax オブジェクトからの応答を使用していないため、関数は無条件に を返します。たとえば、検証が成功した場合、サーバー側のスクリプトが「OK」というテキストを返すとします。次のようなことを試すことができます:

function ValidateInput() {
    var value = stripHtml(CKEDITOR.instances['ReplyBox'].getData()).trim();
    var options = {
        type: "POST",
        url: "../../Services/ForumOperationService.svc/ReplyToPostFeedback",
        data: '{"content":"' + value + '"}',
        async: false,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(msg) {
            $("#StatusReplyLbl").text(msg.ReplyToPostFeedbackResult);
        }
    };
    var resp = $.ajax(options);
    return (resp.status==200 && resp.responseText == "OK");
}

理想的には、無条件に false を返し、成功ハンドラーで自分でポストバックをトリガーします。

于 2012-11-16T19:22:21.480 に答える
1

ajax 関数の戻り値は、成功またはエラー メソッドからの戻り値になるため、ValidateInput() メソッドまでブルブルしません。ajax 呼び出しのスコープ外で変数を宣言し、その結果を返す必要があります。

function ValidateInput() {
    var value = stripHtml(CKEDITOR.instances['ReplyBox'].getData()).trim();
    var result = false;

    $.post("../../Services/ForumOperationService.svc/ReplyToPostFeedback", '{"content":"' + value + '"}', function (msg) {
            $("#StatusReplyLbl").text(msg.ReplyToPostFeedbackResult);
            if (!msg.ReplyToPostFeedbackResult){
                result = true;
            }
    });

    return result;
}
于 2012-11-16T19:32:54.723 に答える
1

あなたが求めていることについて100%ではありませんが、問題は、ajaxリクエストからtrueを返すと予想される場合でも、関数が常にfalseを返すことだと思いますか?

上記のように、ajax で async を実行すると、これが機能しなくなりますが、async を false に設定しているようです。

問題はあなたの返品です。

true を返します。ajax 関数の内部では、関数全体ではなく、ajax 呼び出しの成功関数から戻ります。

これが目的を達成するための最良の方法だとは思いませんが、既に持っているコードに基づいて、必要なものは次のとおりです。

function ValidateInput() {
    var replayToPost = false;
    var value = stripHtml(CKEDITOR.instances['ReplyBox'].getData()).trim();
    var options = {
        type: "POST",
        url: "../../Services/ForumOperationService.svc/ReplyToPostFeedback",
        data: '{"content":"' + value + '"}',
        async: false,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(msg) {
            $("#StatusReplyLbl").text(msg.ReplyToPostFeedbackResult);

            if (msg.ReplyToPostFeedbackResult) {
                replayToPost = false;
            } else {
                replayToPost = true;
            }

        },
        error: function () {
            return true;
        }
    };
    $.ajax(options);
    return replyToPost;
}
于 2012-11-16T19:28:47.027 に答える