2009-10-13 14 views
21

ASP.NET 2.0私は2つの検証グループvalGrpOneとvalGrpTwoを持っていると言うことができます。 2つの検証サマリーvalSummOneとvalSummTwo;セクションを分割する理由は純粋に審美的です。両方のグループの検証をトリガーする1つの送信ボタン。Page_ClientValidate()複数の検証グループを使用する - 複数の要約を同時に表示するにはどうすればよいですか?

今、私はクライアント側の検証をトリガーしたいと同時に、両方の検証要約を同時に表示したいと思っています。

私はbtnSubmitで呼び出されるJavascript関数を設定し、この関数内ではPage_ClientValidate("valGrpOne")Page_ClientValidate("valGrpTwo")を連続して呼び出します。問題は一度に1つのサマリーだけです(しかし、私は本当に両方を表示したい!)

両方の検証要約をクライアント側のコードから同時に表示する方法についてのアイデアはありますか?

次の質問に非常によく似ていますが、これはサーバー側の回答です。 Triggering multiple validation groups with a single button?

+0

私はこれを試していないので、私はこれに答えることができません。しかし、バリデータはクライアント側でトリガ/管理できます。 2002年の日付ですが、http://msdn.microsoft.com/en-us/library/aa479045.aspxを読んでみてください。 –

+0

大丈夫、msdnリンクのおかげで、あなたはそれが日付だと言っていたが、バックグラウンドノイズ(情報)は、私の答えに私を助けた。 – joedotnot

+0

私は同様の条件を持っています。私の問題は、両方のグループが失敗した場合、検証サマリーが2回呼び出されることです。 –

答えて

29

ですから、答えは簡単ではありませんでした。クライアント側の検証のデフォルトの動作は、検証されたばかりの最新のグループ/要約のみを表示することです。しかし、少しのJavascript tweekingは私に受け入れられる答えを与えました。

気軽に改善を提供してください。

<script type="text/javascript" language="javascript"> 
    /* Manual client-side validation of Validator Groups */ 
    function fnJSOnFormSubmit() { 
     var isGrpOneValid = Page_ClientValidate("valGrpOne"); 
     var isGrpTwoValid = Page_ClientValidate("valGrpTwo"); 

     var i; 
     for (i = 0; i < Page_Validators.length; i++) { 
      ValidatorValidate(Page_Validators[i]); //this forces validation in all groups 
     } 

     //display all summaries. 
     for (i = 0; i < Page_ValidationSummaries.length; i++) { 
      summary = Page_ValidationSummaries[i]; 
      //does this summary need to be displayed? 
      if (fnJSDisplaySummary(summary.validationGroup)) { 
       summary.style.display = ""; //"none"; "inline"; 
      } 
     } 

     if (isGrpOneValid && isGrpTwoValid) 
      return true; //postback only when BOTH validations pass. 
     else 
      return false; 
    } 


    /* determines if a Validation Summary for a given group needs to display */ 
    function fnJSDisplaySummary(valGrp) { 
     var rtnVal = false; 
     for (i = 0; i < Page_Validators.length; i++) { 
      if (Page_Validators[i].validationGroup == valGrp) { 
       if (!Page_Validators[i].isvalid) { //at least one is not valid. 
        rtnVal = true; 
        break; //exit for-loop, we are done. 
       } 
      } 
     } 
     return rtnVal; 
    } 
</script> 
+0

これは優れた答えです。私は問題がなかった問題を解決するのを助けました。おかげでニール – Somedeveloper

3

は完全にテストされていない

/* Manual client-side validation of Validator Groups - Remix */ 
function PageValidate() { 
    var PageIsValid = true; 

    for (var validator in Page_Validators) { 
     ValidatorValidate(validator); 
     PageIsValid = PageIsValid && validator.isvalid; 
    } 

    if (PageIsValid) { 
     return true; //postback only when ALL validations pass. 
    } 
    else { 
     return false; 
    } 
} 

/* This also does something similar */ 
function PageValidate() { 
    return Page_ClientValidate(); 
} 
+0

これはいくつかの他の問題で私を助けました:) – nima

0

が、これはjoedotnotの便利なコードを拡張したものです。大部分のasp.netユーザーにとってはおそらく過剰ですが、これは選択されたボタンに応じて、送信時にバリデーショングループの異なる組み合わせを適用しなければならないプロジェクトに役立ちました。様々なイベントハンドラで、その後

var validationManager = function() { 
     // Manual client-side validation of Validator Groups 
     // an empty string('') is default - to validate controls without a validation group 
     var valGroups = [''], 
     returnObj = { //define methods 
      set: function (/*string argument list*/) { 
       valGroups = Array.prototype.slice.call(arguments); 
       return returnObj; 
      }, 
      add: function (/*string argument list*/) { 
       var i; 
       for (i = 0; i < arguments.length; i++) { 
        if (valGroups.indexOf(arguments[i]) === -1) { 
         valGroups.push(arguments[i]); 
        } 
       } 
       return returnObj; 
      }, 
      remove: function (/*string argument list*/) { 
       var i = 0, n = 0; 
       for (i = 0; i < arguments.length; i++) { 
        var n = valGroups.indexOf(arguments[i]); 
        if (n > -1) valGroups.splice(n, 1); 
       } 
       return returnObj; 
      }, 
      validate: function() { 
       var i = 0, 
        summariesToDisplay = []; 
       for (; i < valGroups.length; i++) { 
       if (!Page_ClientValidate(valGroups[i])) { //this will display the contents of the validator 
        summariesToDisplay.push(valGroups[i]); 
        } 
       } 
       if (!summariesToDisplay.length) { return true; } 
       for (i = 0; i < Page_ValidationSummaries.length; i++) { //make relevant summaries visible 
       if (summariesToDisplay.indexOf(Page_ValidationSummaries[i].validationGroup || '') > -1) { 
         Page_ValidationSummaries[i].style.display = "inline"; //"none"; "inline"; 
        } 
       } 
       return false; 
      } 
     }; 
     if (arguments.length > 0) { 
      returnObj.set.apply(null, arguments); 
     } 
     return returnObj; 
    } 

//set up a global object 
    var validateOnSubmit = validationManager('','BMIvalGrp'); 

    //within a radio click handler 
    validateOnSubmit.add('weightValGrp','ageValGrp') 
        .remove('BMIvalGrp'); 

    //added to submit button handlers 
    validateOnSubmit.validate(); 
0

ここでは、簡単な非常に簡単な例を、それを維持することです:

は、あなたのページヘッダー内のJavaScriptメソッドの下を持っている: -

<script type="text/javascript" language="javascript"> 
function ShowModalDialog4Validations() { 
    var x = $find("modalPopupExtenderValidations"); 
    Page_ClientValidate("vgValidations"); 
    if (!Page_IsValid) 
     x.show(); 
} 

modalPopupExtenderValidationsは、モーダルポップアップのIDです。 vgValidationsは、検証グループのIDです。

ここで、ページのプレレンダリング方法で、検証を実行するボタンにonclick属性を追加します。

protected void Page_PreRender(object sender, EventArgs e) 
    { 
     btnMyButton.Attributes.Add("onclick", "ShowModalDialog4Validations();"); 
    } 

わかりやすかったです。

Bye。

+0

これは質問に関連していないようです。具体的には、ページ上の複数の検証グループに要約を表示するという問題は解決しません。 –

0
<b>Lets Say here is u r link button</b> 
<asp:LinkButton ID="lnkbtnSubmit" runat="server" OnClientClick="return fnJSOnFormSubmit();" meta:resourcekey="lnkbtnSubmitResource1">Submit</asp:LinkButton> 
<b> And u r Script is</b> 
<script type="text/javascript"> 


    function confirmAction() { 
     var retVal = confirm("Are you sure want to continue ?"); 
     if (retVal == true) { 

      return true; 
     } 
     else { 

      return false; 
     } 
    } 

    function fnJSOnFormSubmit() { 
     var isGrpOneValid = Page_ClientValidate("updateuser"); 
     var isGrpTwoValid = Page_ClientValidate("BaseKey"); 

     var i; 
     for (i = 0; i < Page_Validators.length; i++) { 
      ValidatorValidate(Page_Validators[i]); //this forces validation in all groups 
     } 

     isGrpOneValid = Page_ClientValidate("updateuser"); 
     isGrpTwoValid = Page_ClientValidate("BaseKey"); 

     i =0; 
     for (i = 0; i < Page_Validators.length; i++) { 
      ValidatorValidate(Page_Validators[i]); //this forces validation in all groups 
     } 

     if (isGrpOneValid && isGrpTwoValid) 
      return true; //postback only when BOTH validations pass. 
     else 
      return false; 
    } 


    /* determines if a Validation Summary for a given group needs to display */ 
    function fnJSDisplaySummary(valGrp) { 
     var rtnVal = false; 
     for (i = 0; i < Page_Validators.length; i++) { 
      if (Page_Validators[i].validationGroup == valGrp) { 
       if (!Page_Validators[i].isvalid) { //at least one is not valid. 
        rtnVal = true; 
        break; //exit for-loop, we are done. 
       } 
      } 
     } 
     return rtnVal; 
    } 




</script> 
2

ここでは、複数のグループに対して妥当性を検証するための別の簡単で一般的な方法を示します。

// Page_ClientValidate only shows errors from the last validation group. 
// This method allows showing for multiple groups 
function Page_ClientValidateMultiple(groups) { 
    var invalidIdxs = []; 
    var result = true; 

    // run validation from each group and remember failures 
    for (var g = 0; g < groups.length; g++) { 
     result = Page_ClientValidate(groups[g]) && result; 
     for (var v = 0; v < Page_Validators.length; v++) 
      if (!Page_Validators[v].isvalid) 
       invalidIdxs.push(v); 
    } 

    // re-show any failures 
    for (var i = 0; i < invalidIdxs.length; i++) { 
     ValidatorValidate(Page_Validators[invalidIdxs[i]]); 
    } 

    // return false if any of the groups failed 
    return result; 
}; 
+0

これははるかに良い、より一般的な答えです。ありがとう@コリン。それには少し問題がありますが、私はそれを機能させるための修正を加えて編集します... – theyetiman

関連する問題