2012-03-08 8 views
6

Czy istnieje sposób sprawdzenia poprawności tekstu wejściowego jsf, który jest tylko do odczytu, ale wartość jest zmieniany po uruchomieniu niektórych innych zdarzeń?jsf (richfaces) readonly input text validation

+2

Czy nie byłoby łatwiej zwalidować to na fasolce back page jsf? – Richie

+0

Jak wyzwalać sprawdzanie poprawności i wyświetlać komunikat sprawdzania poprawności? –

+0

Dodałem odpowiedź jako odpowiedź na komentarz. Pozdrawiam – Richie

Odpowiedz

2

Rozwiązałem ten problem z obejściem problemu. Dodałem pole inputHidden który ma atrybut requiredtrue że nie pojawi się na interfejsie, ale zostaną zatwierdzone:

<h:inputHidden value="#{bean.value}" required="true" 
        requiredMessage="Data must be entered" /> 

Wartość bean.value zostanie zmieniony przez innego zdarzenia, a w pewnym reRender w sprawie inputHidden, odbywa się walidacja.

1

Najprawdopodobniej będziesz musiał ręcznie wywołać logikę walidacji bezpośrednio ze swojego zdarzenia. Oto model cyklu życia JSF od IBM.

enter image description here

Można zauważyć, że proces ten zachodzi faza walidacji przed fazą Wywołanie aplikacji, w której wydarzenia są zazwyczaj obsługiwane. Dzieje się to również po tym, więc sprawdzanie poprawności nie nastąpi automatycznie.

2

Odpowiadanie na komentarz: "Czy nie byłoby łatwiej sprawdzić poprawność w elemencie wspierającym stronę jsf?" Można wykonać sprawdzanie poprawności na poziomie aplikacji za pomocą kliknięcia przycisku lub podobnego zdarzenia. Możesz zrobić coś takiego w swoim podkładzie i połączyć go ze zdarzeniem.

public String login(){ 
     FacesContext context = FacesContext.getCurrentInstance(); 
     if(**<<some validation for value in field 'firstName' in form 'userForm'>>**){ 
      FacesMessage message = new FacesMessage(); 
      message.setSeverity(FacesMessage.SEVERITY_ERROR); 
      message.setSummary("Some Valication check"); 
      message.setSummary("Some Valication check!!"); 
      context.addMessage("userForm:firstName", message);//adds validation message for field firstName in form userForm 
      return "ERROR"; 
     } 
     return "SUCCESS"; 
    } 

Mam nadzieję, że to pomogło.

+0

JSF nie zaktualizuje wartości modelu dla wejścia 'readonly =" true "'. Co więcej, robienie valdacji w metodzie akcji zamiast w normalnym walidatorze jest kiepską praktyką. – BalusC

+0

@BalusC Dziękuję za informacje :) Nie wiedziałem, że ustawienie readonly = "true" dla danych wejściowych nie zaktualizuje wartości modelu. Jeśli chodzi o sprawdzanie poprawności wewnątrz akcji, wiem, że nie jest to najlepsza praktyka, ale myślę, że możemy nie być w stanie dodać normalnego walidatora do wprowadzania tylko do odczytu. – Richie

12

Ustaw atrybut readonly na true tylko podczas fazy odpowiedzi na render. W ten sposób nie będzie on postrzegany jako tylko do odczytu we wszystkich innych fazach niż faza odpowiedzi renderowania.

<h:inputText ... readonly="#{facesContext.currentPhaseId.ordinal eq 6}" /> 
+2

W moim przypadku '# {facesContext.renderResponse} zwraca wartość false podczas rysowania kodu HTML (gdyby został wydrukowany w środku). W każdym razie działa jako '# {facesContext.currentPhaseId.ordinal eq 6}'. Mojarra 2.1.9. – SJuan76

Powiązane problemy