2016-06-10 11 views
0

Mit PrimeFaces 5.3 in WebSphere läuft 8.5.5JSF/PrimeFaces zeigt keine Benutzer eingegebenen Wert, wenn Validierungsfehler auftritt

ich ein Formular mit zwei Pflichtfelder haben, eine inputText und selectOneMenu. Ich wähle einen gültigen Wert (z. B. Statuslos) im Menü aus, lasse aber das Textfeld leer, was zu einem Fehler führt. Ich korrigiere dann das Textfeld, aber der Benutzer drückt auch die "S" -Taste auf dem Menü - "Stateless" wieder auswählen, sondern das Ergebnis ist "Select Country", was bedeutet, nichts ausgewählt - ein weiterer Validierungsfehler.

Wenn der Benutzer die EINGABETASTE drückt, erhalten sie eine weitere Fehlermeldung für die selectOneMenu und das Feld selbst wird als fehlerhaft markiert, aber ein gültiger Wert von "Stateless" erscheint - was für mich verwirrend ist, wie Benutzer reagieren werden!

Gibt es einen Weg zu immer die vom Benutzer eingegebenen Werte beibehalten?

Ich füge einen gesäuberten Code an, der das Problem demonstriert. Ich habe Menüs, die alle Länder (sowie US-Bundesstaaten, mexikanische Bundesstaaten, kanadische Provinzen) auflisten, daher ist es unmöglich, einen Buchstaben für den Standardwert zuzuweisen, der nicht auch für einen gültigen Wert gilt.

XHTML

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:p="http://primefaces.org/ui"> 
    <h:head> 
     <!-- IE standards mode override *must* appear first - use resource ordering facet to force this. --> 
     <f:facet name="first"> 
      <meta http-equiv="x-ua-compatible" content="IE=edge" /> 
      <!-- 
       <meta http-equiv="x-ua-compatible" content="IE=edge" /> 
       ^Prevents IE from reverting to 'IE7 Standards Mode' when accessing via non-localhost hostname. 
       Must appear immediately after <title> element. Note that setting this at the server level (ie: in websphere) 
       is considered preferable. See: http://stackoverflow.com/questions/6156639/x-ua-compatible-is-set-to-ie-edge-but-it-still-doesnt-stop-compatibility-mode 
      --> 
     </f:facet> 
    </h:head> 
    <h:body> 
     <br/> 
     <h:form id="dataForm"> 
      <p:outputLabel for="note" value="Note"/>: 
      <p:inputText id="note" size="30" maxlength="50" value="#{Test.note}" required="true" /> 
      <br /> 
      <p:outputLabel for="citizenship" value="Citizenship:"/> 
      <p:selectOneMenu id="citizenship" value="#{Test.citizenship}" required="true"> 
       <f:selectItem itemLabel="Select Country..."/> 
       <f:selectItem itemValue="1" itemLabel="Canada"/> 
       <f:selectItem itemValue="2" itemLabel="United States"/> 
       <f:selectItem itemValue="3" itemLabel="Mexico"/> 
       <f:selectItem itemValue="-1" itemLabel="Stateless"/> 
      </p:selectOneMenu> 
      <br /> 
      <p:commandButton value="Save" type="submit" action="#{Test.save}" ajax="false" /> 
     </h:form> 
    </h:body> 
</html> 

Java

import javax.inject.Named; 

@Named ("Test") 
public class Test 
{ 
    private String note; 
    private Integer citizenship; 

    public Integer getCitizenship() 
    { 
     return citizenship; 
    } 

    public String getNote() 
    { 
     return note; 
    } 

    public void setNote(String note) 
    { 
     this.note = note; 
    } 

    public void setCitizenship(Integer citizenship) 
    { 
     this.citizenship = citizenship; 
    } 

    public String save() 
    { 
     System.out.println("Citizenship=" + this.citizenship); 

     return "test"; 
    } 
} 

EDIT

Applied folgende Modifikation, aber es hatte überhaupt keine Wirkung. Wenn ich "S" drücke, würde ich immer noch die Option "Select Country ..." auswählen und wenn ich auf das Steuerelement klicke, könnte ich die Option "Select Country ..." sehen und auswählen.

<p:selectOneMenu id="citizenship" value="#{Test.citizenship}" required="true" hideNoSelectionOption="true"> 
       <f:selectItem itemValue="#{null}" itemLabel="Select Country..." noSelectionOption="true"/> 

Noch etwas, das ich während des Studiums im Detail in meinem Browser-Debugger bemerkte. Der ausgewählte Wert des HTML-Optionselements ändert sich nicht, wenn ich eine andere Option auswähle - eher eine Beschriftung. Das eigentliche HTML-Select-Element befindet sich in einem DIV mit der Klasse "UI-Helper-Hidden-Accessible". Ich frage mich, ob das etwas bedeuten könnte ...

+0

Ich habe einen Hack gefunden, der funktioniert. Wenn ich ein Leerzeichen vor dem Standardland hinzufüge, wird verhindert, dass der Standardwert durch einen Buchstaben ausgewählt wird. Z.B. Ersetzen Sie "Select Country ..." mit "Select Country ...". Wenn der Benutzer jedoch absichtlich den Standardwert auswählt, wird das seltsame Verhalten zurückgegeben, bei dem das Feld den letzten gültigen Wert erhält, aber immer noch als fehlerhaft gekennzeichnet ist. – BigMac66

+0

Ist http://StackOverflow.com/questions/13478663/noselectionoption-Attribute Teil Ihres Problems nicht? – Kukeltje

Antwort

0

So wird angegeben, dass "Eingabe-Komponenten ihre lokalen Werte im Status behalten, wenn die Validierung fehlschlägt." Das führt mich zu der Annahme, dass das Problem hier ist, dass die select country-Option das itemLabel-Tag nicht enthält. Ich weise es normalerweise itemLabel = "" oder null zu. Es gibt auch eine noSelectionOption Option für die f:selectItem, die helfen kann.

Diese Antwort hat mir geholfen, mit einem ähnlichen Problem eine Weile zurück: Best way to add a "nothing selected" option to a selectOneMenu in JSF

0

OK fand ich einen Weg, um es zu beheben - im Wesentlichen wechsle ich von der PrimeFaces Version auf Ebene JSF. Das heißt:

<p:selectOneMenu id="citizenship" value="#{Test.citizenship}" required="true" hideNoSelectionOption="true"> 

Um

<h:selectOneMenu id="citizenship" value="#{Test.citizenship}" required="true" hideNoSelectionOption="true"> 

Es scheint etwas nicht stimmt mit der Version von PrimeFaces sein dürfen wir auf WebSphere verwenden - dies geschieht das dritte Mal sein, die ich eine „feste“ haben Problem durch Umschalten auf JSF.