2012-05-03 3 views
2

У меня проблема с проверкой формы ajax. Я использую struts-core 2.3.1.2, struts-jquery-plugin 3.3.0 и struts-json-plugin.Struts ajax форма проверки

Проблема возникает, если форма ajax будет отправлена ​​с помощью запроса ajax, и проверка не выполняется. Следовательно, вся форма будет помещена в элемент результата. Поэтому вы можете активировать проверку ajax на кнопке ajax sumbit. http://code.google.com/p/struts2-jquery/wiki/Validation

Здесь также устаревшая информация: http://struts.apache.org/2.2.3.1/docs/ajax-validation.html

Но перехватчик "jsonValidationWorkflowStack" отсутствует в распорок-DEFAULT.XML, как написано в сообщении: jsonValidationWorkflowStack seems to be removed in Struts 2.3.1

Он добыт из к struts- json-plugin в struts-plugin.xml. Я не знаю, как я могу использовать это непосредственно, но я построю свой стек в struts.xml:

<!-- Sample JSON validation stack --> 
<interceptor-stack name="jsonValidationWorkflowStack"> 
      <interceptor-ref name="basicStack"/> 
      <interceptor-ref name="validation"> 
       <param name="excludeMethods">input,back,cancel</param> 
      </interceptor-ref> 
      <interceptor-ref name="jsonValidation"/> 
      <interceptor-ref name="workflow"/> 
     </interceptor-stack> 
    </interceptors> 
<action name="updateMySettings" method="execute" class="de.ra.daod.actions.MyAppSettingAction"> 
     <interceptor-ref name="jsonValidationWorkflowStack"/> 
        <!-- This is not beauty within ajax --> 
     <result name="input">/WEB-INF/jsp/mysetting_ajax.jsp</result> 
     <result name="success" type="stream"> 
      <param name="contentType">text/html</param> 
      <param name="inputName">inputStream</param> 
     </result> 
    </action> 

И моя форма выглядит следующим образом:

<s:head /> 
<sj:head /> 
    <!-- This files are needed for AJAX Validation of XHTML Forms --> 
    <script src="${pageContext.request.contextPath}/struts/xhtml/validation.js" type="text/javascript"></script> 

<s:form id="form" action="private/updateMySettings" theme="xhtml"> 
       <s:textfield id="screenRes" key="appSetting.screenResolution" label="Screen resolution" required="true" /> 
<s:select key="appSetting.screenDepth" label="Color depth" list="#{'8':'8','16':'16','24':'24'}" required="true" /> 
<sj:submit value="Update Settings" targets="status" validate="true"/> 
      </s:form> 

К сожалению, я получаю JavaScript ошибка, если проверка не пройдена или нет:

Uncaught TypeError: Object #<Object> has no method 'indexOf' 
f.extend.ajax jquery-1.7.1.min.js:4 
b.fn.ajaxSubmit 
a.struts2_jquery.validateForm jquery.struts2-3.3.0.min.js:18 
a.subscribeHandler.h.beforeSubmit jquery.struts2-3.3.0.min.js:18 
b.fn.ajaxSubmit 
a.subscribeHandler.e jquery.struts2-3.3.0.min.js:18 
e.extend.each jquery-1.7.1.min.js:2 
a.subscribeHandler.e jquery.struts2-3.3.0.min.js:18 
f.event.dispatch jquery-1.7.1.min.js:3 
f.event.add.h.handle.i jquery-1.7.1.min.js:3 
f.event.trigger jquery-1.7.1.min.js:3 
f.fn.extend.trigger jquery-1.7.1.min.js:3 
e.extend.each jquery-1.7.1.min.js:2 
e.fn.e.each jquery-1.7.1.min.js:2 
f.fn.extend.trigger jquery-1.7.1.min.js:3 
d.fn.extend.publish jquery.subscribe.min.js:16 
e.extend.each jquery-1.7.1.min.js:2 
d.fn.extend.publish jquery.subscribe.min.js:16 
(anonymous function) jquery.struts2-3.3.0.min.js:18 
f.event.dispatch jquery-1.7.1.min.js:3 
f.event.add.h.handle.i jquery-1.7.1.min.js:3 

кажется, что объект JSON из ответа не может быть обработан и я не знайте, почему причина я следовал старым инструкциям. Я предполагаю, что причиной является функция StrutsUtils.getValidationErrors из struts/utils.js, если эта функция используется с объектом json, но я не уверен. Может ли кто-нибудь помочь?

+0

Никто не знает? Должна быть возможна проверка аякс-запросов в struts 2.3.1.2 или нет? Из-за того, что jsonValidationWorkflowStack не поддерживается новейшей версией struts, я добавил плагин struts-json-plugin 2.3.1.2, где jsonValidationWorkflowStack доступен, но существует только старое руководство с приведенным выше результатом. Может ли кто-нибудь помочь? – Caphalor40k

ответ

0

Вы готовы к решению Struts2 Issue. Обновляйте до последней версии 2.3.3 или 2.3.4, и ваша проблема не исчезнет.

+0

Большое спасибо, это решило мою проблему с ошибкой javascript. Он работает хорошо, но не идеально, потому что, если я отправлю форму без ошибок проверки, результат потоковой передачи будет помещен в целевой (контейнер div), а затем я отправлю форму с ошибками проверки, и содержимое из этого целевого контейнера не удаляется, поэтому может быть запутанным. Я предполагаю, что результат успешного запроса будет удален, если у нас есть ошибки проверки? Спасибо – Caphalor40k

+0

Я думаю, что результат потока, и ajax не играет хорошо вместе. просто удалите атрибут целей. – Johannes

1

Я думаю, что результат потока, и ajax не играет хорошо вместе. просто удалите цели атрибут. - jogep

Я не согласен с вами, потому что тенор AJAX не загружает новую страницу, а загружает части любой из текущей страницы, поэтому я использую кнопку отправки AJAX. Чтобы заметить пользователя действия без перезагрузки самой страницы. Обходной путь состоит в том, чтобы очистить содержимое элемента div состояния с помощью javascript. Я думаю, что это можно автоматизировать в struts2-jquery-plugin. Это моя форма, которая встроена в панель с вкладками.

<%@ page language="java" contentType="text/html; charset=UTF-8" 
pageEncoding="UTF-8"%> 
<%@ taglib prefix="s" uri="/struts-tags" %> 
<%@ taglib prefix="sj" uri="/struts-jquery-tags"%> 

<s:if test="appSetting != null"> 
<h3>Application settings</h3> 
<div id="status" class="welcome"></div> 
<table> 
    <tr> 
     <td> 
      <s:form id="form" action="updateMySettings" theme="xhtml"> 
       <s:textfield id="screenRes" key="appSetting.screenResolution" 
        label="Screen resolution" required="true" /> 
       <s:select key="appSetting.screenDepth" label="Color depth" 
        list="#{'8':'8','16':'16','24':'24'}" required="true" /> 
       <sj:submit id="updateSetting" value="Update Settings" targets="status" validate="true" /> 
      </s:form> 
     </td> 
     <td valign="top"> 
      <button id="fullScreen">Use full screen</button> 
      <button id="fullBrowser">Use full browser</button> 
     </td> 
    </tr> 
</table> 
<script> 
$("#fullScreen").click(function() { 
    scr_width = Math.max(screen.width,screen.height); 
    scr_height = Math.min(screen.width,screen.height); 
    $("#screenRes").val(scr_width + 'x' + scr_height); 
}); 
$("#fullBrowser").click(function() { 
    brw_width = Math.max(window.innerWidth, window.innerHeight); 
    brw_height = Math.min(window.innerWidth, window.innerHeight); 
    $("#screenRes").val(brw_width + 'x' + brw_height); 
}); 
$("#updateSetting").click(function() { 
    $("#status").empty(); 
}) 
</script> 
</s:if> 
<s:else> 
<p>No settings available.</p> 
</s:else> 

Это работает очень хорошо.

Смежные вопросы