2010-12-13 44 views
2

Voici le problème, la validation JSF ne cesse de retourner un champ à la dernière valeur connue.Contourner la validation JSF pour un composant UIInput

Nous modifions une page où le bean backing a déjà des valeurs. (frequency = "weekly")

Et nous sommes tenus de montrer la valeur par défaut de "s'il vous plaît choisir .." même si cette valeur ne passera pas la validation (oui, je veux juste laisser l'utilisateur sur la page avec le message d'erreur).

Est-il possible de permettre à l'utilisateur de choisir "Sélectionner .." et de ne pas le réinitialiser à la dernière bonne valeur?

L'utilisateur ne sera pas autorisé à enregistrer évidemment, mais nous voulons laisser leur valeur invalide sélectionnée.

  1. utilisateur ajoute un nouvel objet, en sélectionnant la valeur appropriée dans le menu déroulant
  2. utilisateur enregistre avec succès.
  3. utilisateur clique sur « modifier » et affiche un objet avec valeur connue (« hebdomadaire »)
  4. utilisateur change «sélectionnez » « hebdomadaire » à
  5. utilisateur clique enregistrer
  6. un message de validation est affiché (bien) mais la fréquence va retour à la dernière valeur "weekly" (mauvais, je dois rester sur "Please select .." et laisser l'utilisateur corriger le menu déroulant manuellement.)

0 = immédiat = "true" ne fonctionne pas sur inputComponents, seulement CommandComponents

Répondre

3

Je reconnais Nize cela, j'ai signalé cela il y a plus d'un an comme JSF issue 1299. Ceci n'est toujours pas résolu car il a une priorité basse. Ceci n'est pas spécifique à tous les composants UIInput, mais à MenuRenderer qui est responsable du rendu des éléments HTML <select>. Tous les autres éléments d'entrée HTML se comportent comme vous le souhaiteriez, la valeur soumise sera réaffichée (bien, ce qui est en fait rien aussi).

Puisque vous êtes déjà sur JSF 2.0, je vous suggère de résoudre ceci avec un peu d'aide de f:ajax afin que la liste déroulante ne soit pas rendue et conserve ainsi sa sélection.

<h:selectOneMenu id="frequency" value="#{bean.frequency}" required="true"> 
    <f:selectItems value="#{bean.frequencies}" /> 
    <f:ajax render="frequencyMessage" /> 
</h:selectOneMenu> 
<h:message id="frequencyMessage" for="frequency" /> 

L'avantage est que l'utilisateur final a une rétroaction instantanée et ce qui est mieux pour l'expérience utilisateur.

+0

Merci Balus! J'ai joué avec un peu, mais une fois que l'utilisateur clique sur "soumettre", la valeur sera toujours inversée, n'est-ce pas? Ou est-ce que cela s'applique aussi quand la page entière est re-rendue après soumettre (je pense que ce n'est pas le cas) – Eddie

+0

Utilisez aussi ajax pour cela. Mettez '' dans 'h: commandButton', si nécessaire avec un' render' sur les identifiants de message. – BalusC

+0

C'est un truc pratique pour les commentaires en direct, et montre leur erreur tout de suite. Mais même avec ajax dans mon bouton de commande avec render = "messageList" (j'utilise une seule boîte de messgae au-dessus des boutons), l'action de sauvegarde retourne encore le messageList à la valeur de pré-validation. ..... Peut-être que je vais juste faire le message en direct lire "cette valeur est nécessaire et retournera à la valeur précédente si non défini" – Eddie