1

私はajax検証を使用して以下を検証しました

   <tr>
      <td width="20" style='color: red'>
         <img src="images/icon-star.png" width="16" height="16" />
      </td>
      <td id="lblCustomBillNo" style="width: 15%" class="searchCriteriaCellLbl">
         The custom Bill Number
      </td>
      <td width="5" class="searchCriteriaCellLbl">:</td>
      <td class="searchCriteriaCellVal">
          <s:textfield id="customBillNo" name="customBillNo" size="20" maxlength="24" style="width: 200px" />
      </td>
      <td class="errorFlag" style="color: red" valign="middle">
          <s:fielderror fieldName="customBillNo" />
      </td>
  </tr>
  <tr>
      <td width="20" style='color: red'>
        <img src="images/icon-star.png" width="16" height="16" />
      </td>
      <td id="lblBillNo" style="width: 15%" class="searchCriteriaCellLbl">
         <s:property value="%{getText('billNo')}" />
      </td>
      <td width="5" class="searchCriteriaCellLbl">:
      </td>
      <td class="searchCriteriaCellVal">
          <s:textfield label="billNo" id="billNo" name="billNo" size="20" maxlength="24" style="width: 200px" />
      </td>
      <td class="errorFlag" style="color: red" valign="middle">
          <s:fielderror fieldName="billNo" />
      </td>
  </tr>
  <tr>
      <td width="20" style='color: red'>
        <img src="images/icon-star.png" width="16" height="16" />
      </td>
     <td id="lblCarrierNo" style="width: 15%" class="searchCriteriaCellLbl">
        The carrier Number
     </td>
     <td width="5" class="searchCriteriaCellLbl">:
     </td>
     <td class="searchCriteriaCellVal">
        <s:textfield label="carrierNo" id="carrierNo" name="carrierNo" size="20" maxlength="24" style="width: 200px" />
     </td>
     <td class="errorFlag" style="color: red" valign="middle">
        <s:fielderror fieldName="carrierNo" />
     </td>
 </tr>

golbali18nファイルのエラーには次の国際化を使用します

errors.required=${getText(fieldName)} requireddd

そしてこの検証ファイル

 <validators>      
     <field name="customBillNo">
        <field-validator type="requiredstring" short-circuit="true">
           <param name="trim">true</param>
           <message key="errors.required" />
        </field-validator>
     </field>
     <field name="billNo">
      <field-validator type="required" short-circuit="true">
        <message key="errors.required" />
       </field-validator>
     </field>
     <field name="carrierNo">
       <field-validator type="required" short-circuit="true">
          <message key="errors.required" />
       </field-validator>
     </field>
   </validators>

そして私はこのjavascriptをajax検証を使用するために置きました

      function validate(){

            //document.all.loading.style.display = 'block';

            var searchUrl = 'AddEnteringApproval_approval';

            var params = '';

            var elemArray = document.mainForm.elements;
            for (var i = 0; i < elemArray.length;i++)
            {
                var element = elemArray[i];

                var elementName= element.name;
                if(elementName=='formAction')
                    continue;
                params += '&' + elementName+'='+ encodeURIComponent(element.value);
            }

            params += '&struts.enableJSONValidation=true&struts.validateOnly=true';

            createXmlHttpObject(); // this is my function that prepare ajax

            sendRequestPost(http_request,searchUrl,false,params);

            postValidation();

    }

    function postValidation() {
       var form = $('#mainForm');

       var text = http_request.responseText;

       //clear previous validation errors, if any
       StrutsUtils.clearValidationErrors(form);
       alert(text)
       //get errors from response
       //var text = request.responseText;
       var errorsObject = StrutsUtils.getValidationErrors(text);

       //show errors, if any
       if(errorsObject.fieldErrors)
       {
         StrutsUtils.showValidationErrors(form, errorsObject);
       }
       else
       {
         //good to go, regular submit
         form.submit();
       }
    }


       /*  This is one of the functions that doesn't work using the simple theme, so I redefined it.
        This can be changed to clear the previous errors, as it does in the commented example
        cleaning the errors on divErrors.
        As I am just showing the messages with alerts I don't need to clear anything,
        but the method still need to be redefined, even if it is empty.
     */

   StrutsUtils.clearValidationErrors = function(form, errors) {
        //clear the div errors
        //$('#divErrors').empty();
    }


    /* This method is responsible to show the messages.
       The original versions works with the xhrml and css-xhtml theme but doesn't work with the simple theme
       so I override the method with another implementation that shows the messages using alerts.
       You can change the implementation to show the messages as you want,
       but as the previous method this has to be redefined.
     */

    StrutsUtils.showValidationErrors = function(form, errors) {

        if(errors.fieldErrors)
        {alert((errors.fieldErrors))
             for(var fieldName in errors.fieldErrors)
             { 
                 alert("errors.fieldErrors[fieldName]   " + errors.fieldErrors[fieldName]);

               for(var i = 0; i < errors.fieldErrors[fieldName].length; i++)
               {
                   alert('Field ->' + fieldName + '\nError -> ' + errors.fieldErrors[fieldName][i]);
               }
             }
        }
    };

しかし、コードを実行すると、アラートメッセージボックスに表示された整理されたJSONテキストが表示されません。フィールド名がエラーメッセージのフィールド名と異なり、2番目のフィールド名が欠落し、3番目のフィールド名がカットされます(つまり、carrierNoがrNoになります) )。

手伝って頂けますか。JSONエラーのフィールド名をエラーメッセージテキストと一致させたい

何が問題なのかわかったのですが、なぜそれが起こるのか、なぜなのかわかりません。常に最初の6文字を削除します。なぜこれが起こるのか

ここに画像の説明を入力してください

4

1 に答える 1

1

よく私は問題を理解しました。org.apache.struts2.interceptor.validation.JSONValidationInterceptorにありました

この不完全なifステートメントのため、最初の6文字が削除されます

sb.append((validationAware instanceof ModelDriven) ? ((String)fieldError.getKey()).substring(6) : (String)fieldError.getKey());

このエラーはStruts2.1.8で発生します

こんな感じになります

sb.append(((validationAware instanceof ModelDriven)) && (fieldErrorKey.startsWith("model.")) ? fieldErrorKey.substring(6) : fieldErrorKey);

後のストラットリリースで修正されました。問題を修正しました。そして、問題に直面している人々のために情報を共有しなければならないと思いました。

于 2012-11-06T12:43:24.957 に答える