2010-05-11 4 views
0

Je crée une application Web dans Seam mais j'ai rencontré un problème que je n'arrive pas à résoudre.La valeur du formulaire n'a pas été transmise à Seam bean après a4j reRender

J'ai un formulaire JSF où le client peut sélectionner un type de réservation via une zone de liste déroulante. En fonction de la valeur sélectionnée, les autres composants du formulaire sont rendus. Par exemple: le client sélectionne Heures comme type de réservation, un panelGroup est rendu où le client peut sélectionner une heure de début et une heure de fin. Mais si le client sélectionne «partie de la journée» comme type de réservation, un selectOneMenu est rendu où le client peut sélectionner une partie de la journée (matin, après-midi, soir)

Le puits de réadressage mais les valeurs des composants avec un rendu conditionnel ne sera pas passé au bean. Ils restent des valeurs nulles.

C'est le code que je parle:

<s:div id="spot" 
     rendered="#{selectedProduct.productType.name eq 'Flex Spot'}"> 

    <h:panelGrid columns="2"> 
     <h:outputText value="Reservation Type" /> 
     <h:selectOneMenu value="#{selectedPeriodPart}"> 
      <s:selectItems 
       value="#{productManager.getAvailableDayPartsSpot()}" 
       var="daypart" 
       label="#{daypart.label}"></s:selectItems> 
      <s:convertEnum /> 

      <a4j:support ajaxSingle="true" 
         event="onchange" 
         action="#" 
         reRender="spot"> 
      </a4j:support> 
     </h:selectOneMenu> 

     <h:outputText id="date_spot" value="Date" /> 

     <a4j:outputPanel id="calendar_spot" layout="block"> 
      <rich:calendar value="#{reservation.reservationPeriod.startDate}" 
          locale="en" cellWidth="24px" 
          cellHeight="22px" 
          style="width:200px" /> 
     </a4j:outputPanel> 

     <h:outputText rendered="#{selectedPeriodPart eq 'DAY_PART'}" 
         value="Daypart" /> 

     <h:selectOneMenu value="#{selectedDaypart}" 
         rendered="#{selectedPeriodPart eq 'DAY_PART'}"> 
      <f:selectItem id="si_morning" itemLabel="Morning (6:00 - 12:00)" 
          itemValue="morning" /> 
      <f:selectItem id="si_afternoon" 
          itemLabel="Afternoon (12:00 - 18:00)" itemValue="afternoon" /> 
      <f:selectItem id="si_evening" itemLabel="Evening (18:00 - 00:00)" 
          itemValue="evening" /> 
     </h:selectOneMenu> 

     <h:outputText rendered="#{selectedPeriodPart eq 'HOURS'}" 
         value="Hours" /> 

     <h:panelGroup id="hours_spot" 
         rendered="#{selectedPeriodPart eq 'HOURS'}"> 
      <ui:include src="/includes/reservation/select_hours.xhtml" /> 
     </h:panelGroup> 
    </h:panelGrid> 
</s:div> 

Note: La valeur du calendrier ne se repassée à la fève, mais la valeur de ce morceau de code ne (ne si vous supprimez le rendu conditionnel):

selectOneMenu value="#{selectedDaypart}" rendered="#{selectedPeriodPart eq 'DAY_PART'}" 

Répondre

0

Je l'ai corrigé -.- Rien n'allait mal avec le code que j'ai posté. Parce que je n'étais pas capable de résoudre ce problème, j'ai continué sur une autre page dans la même conversation. J'ai remarqué un comportement plus étrange: la sortie d'une variable ne fonctionnait pas, etc.

Je me suis dit que l'erreur était dans une autre partie du code qui, corrigée, corrigeait tout le problème.

Merci d'avoir répondu!

0

Vous devez vous assurer que les conditionals responsables de l'issue de l'attribut rendered sont également les mêmes dans la demande subséquente du formulaire soumettre. Parce que quand un composant n'est pas rendu, JSF n'appliquera pas les valeurs de la demande.

En résumé, la propriété derrière #{selectedPeriodPart} doit être la même dans la requête suivante. Il existe plusieurs solutions:

  1. Mettez le bean dans la portée de session. Solution la plus simple, mais mauvaise pour la mémoire du serveur et l'expérience client (les mises à jour seront reflétées dans plusieurs onglets/fenêtres dans la même session).

  2. Passez le en utilisant <h:inputHidden>. Pas sûr cependant comment cela correspond à l'image Ajax/Richfaces. Mieux vaut utiliser ici <a4j:keepAlive>.

  3. Utilisez une étendue de conversation. Seam offre des installations pour cela.

+0

Merci d'avoir répondu à la question =) Il ne résout pas mon problème = ( Pour faire des choses: Le backing bean est un bean session stateful (ejb). Avec un champ de conversation J'ai essayé d'emballage selectOneMenu value="#{selectedDaypart}" dans a4j:outputPanel et mettre le rendu conditionnel sur ce composant, mais cela n'a pas fonctionné non plus – Casper

+0

Désolé, ne peut pas aider beaucoup plus que simplement suggérer d'exécuter un débogueur.Au moins, vous savez maintenant où chercher la cause du problème et comment le réparer: assurez-vous que l'attribut 'rendered' du composant en question n'évalue pas' false' dans la requête suivante. – BalusC

Questions connexes