2012-11-16 32 views
0

我在ASP.NET中有一個按鈕。當用戶點擊按鈕時,我想事先做一些驗證,所以回發僅在驗證方法返回true時纔會發生。按鈕 - 只有在JavaScript函數返回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

由於您未使用來自ajax對象的響應,因此您的函數將無條件返回false。例如,讓我們假設您的服務器端腳本在驗證成功時返回文本「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,並引發自己回發在成功處理程序。

+0

謝謝 - 該解決方案的工作,並將短期工作.. :-)我們將定義考慮觸發回發代替。再次感謝。 –

1

不是100%你問什麼,但我相信問題是,即使你希望它從ajax請求返回true,函數總是返回false?

如上所述,ajax運行異步會導致這不起作用,但它看起來像你設置async爲false。

問題是您的退貨。

return 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; 
} 
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; 
} 
相關問題