2010-12-08 2 views
1

JSF2에 2 개의 체크 박스 (<h:selectBooleanCheckbox>)가있는 양식이 있습니다. 적어도 하나는 확인해야합니다. 두 검사도 괜찮지 만 검사를하지 않으면 오류가 발생합니다.JSF2 : 두 개의 종속 확인란의 유효성을 검사하는 방법은 무엇입니까?

이 확인은 아약스에서도 유효합니다. 즉 사용자가 체크/체크하지 않으면 오류 메시지가 사라지거나 나타나야합니다.

그래서 두 체크 박스를 UISelectBoolean 요소에 바인딩하고 각각에 유효성 검사기를 추가했습니다. 유효성 검사기에서 두 번째 체크 상자의 값을 확인하고 false 인 경우 현재 체크 박스도 false로 설정하면 errormessage가 생성됩니다. 매끄러운 좋아 : 다른도 선택하지 않은 상태에서 사용자가 페이지에 확인란을 선택하거나 선택 취소 할 때

if (newValue == false && secondCheckbox.getValue() == false) { 
    throw new ValidationException(); 
} 

문제는,이 거짓 값은 UISelectBoolean에 모델로 이동하거나 행사하지 않습니다.

시나리오 :

  1. 은 처음에 모두 체크되지 않은
  2. 사용자 확인 CheckBox1을합니다.
  3. newValuetrue이므로 유효하며 UISelectBoolean 및 model로 이동합니다.
  4. 사용자는 확인란 1을 선택 취소합니다. 확인란 2는 false이고 newValuefalse이므로 예외가 발생합니다. 유효성 검사가 실패했기 때문에이 false 값은 모델이나 UISelectBoolean 요소로 전달되지 않습니다.
  5. 사용자 확인 확인란 2. True 값은 모델 및 UISelectBoolean로 이동합니다.
  6. 사용자는 확인란 2를 선택 취소합니다. Checkbox1은 페이지에서 여전히 선택 취소되었지만 모델 및 UISelectBoolean에는 여전히 true이 있습니다. 따라서 유효성 검사가 통과되고 오류 메시지가 표시되지 않습니다. 페이지에서 두 확인란의 선택이 해제되어 있지만 model checkbox1에서는 여전히 true입니다.

어떻게 이러한 문제를 해결할 수 있습니까?

+0

''를 사용할 수없는 이유가 무엇입니까? – BalusC

+0

네, 몰랐습니다 :) 고마워요! – amorfis

+0

을 추가 할 수 있습니까? F : 아약스가 작동하지 않는 것 같습니다. – amorfis

답변

1

<h:selectManyCheckbox required="true">을 고려하십시오. 여기에 킥오프 예입니다

<h:form> 
    <h:selectManyCheckbox id="options" value="#{bean.checked}" required="true"> 
     <f:selectItems value="#{bean.options}" /> 
     <f:ajax render="optionsMessage" /> 
    </h:selectManyCheckbox> 
    <h:message id="optionsMessage" for="options" /> 

    <h:commandButton value="Submit" action="#{bean.submit}"> 
     <f:ajax execute="@form" render="@form" /> 
    </h:commandButton> 
    <h:messages globalOnly="true" /> 
</h:form> 

@ManagedBean 
@RequestScoped 
public class Bean { 

    private List<String> checked; 
    private List<String> options = Arrays.asList("first", "second"); 

    public void submit() { 
     System.out.println("Checked: " + checked); 
    } 

    // ... 
} 

f:ajax 여기에 잘 작동합니다. 아마 event="valueChange" (기본값) 대신 event="click"을 사용했기 때문에 렌더링 후에 체크 표시가 유지되지 않습니다. click은 즉, 확인 표시가 시각적으로 설정되기 전에 바로 호출됩니다. 렌더링은 시각적으로 설정되는 체크 표시를 차단합니다.

+0

감사합니다. @BalusC!:) 내가 가지고있는 유일한 문제는 그것이

을 생성한다는 것인데, 나는 내부에
다른 테이블을 가지고있다. 이 요소가 체크 상자 테이블 아래에 표시되면 아무 것도 넣지 않습니다. "후"테이블을 표시 할 수있는 방법이 있습니까? 나는 체크 박스 테이블의 오른쪽과 같은 레벨에 있음을 의미한다. – amorfis

+1

CSS를 사용하여'display : inline;'또는'float : left;'로 설정하십시오. Tomahawk의''도 도움이 될 것이다. 원하는 곳 어디에서나 [''] (http://myfaces.apache.org/tomahawk-project/tomahawk20/tagdoc/t_checkbox.html)을 배치 할 수 있습니다. 마크 업을 완벽하게 제어 할 수 있습니다. – BalusC

관련 문제