2

我有三个单选按钮,一个 inputText 和一个提交按钮。我只想在选择某个收音机时验证提交时的输入文本。所以我有

<h:inputText validator="#{myBean.validateNumber}" ... />

在我的豆子里,我有

 public void validateNumber(FacesContext context, UIComponent component,
                Object value) throws ValidatorException{
      if(selectedRadio.equals("Some Value"){
           validate(selectedText);
      }
 }

 public void validate(String number){
      if (number != null && !number.isEmpty()) {
        try {
            Integer.parseInt(number);
        } catch (NumberFormatException ex) {
            throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
                "Error", "Not a number."));
        }
      } else {
        throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
                "Error", "Value is required."));
      }
 }

使这不起作用的一件事是,当我提交时,validateNumber(...)在我的单选按钮的 setter 方法之前运行setSelectedRadio(String selectedRadio)。因此造成这种说法

 if(selectedRadio.equals("Some Value"){
       validate(selectedText);
 }

不能正确执行。关于如何解决这个问题的任何想法?

4

2 回答 2

3

selectedRadio是一个模型值,仅在更新模型值阶段更新,即验证阶段之后。这就是为什么在您尝试检查它时它仍然是初始模型值。

您必须从请求参数映射(这是原始提交的值)或UIInput引用中获取它,以便您可以获取提交的值 bygetSubmittedValue()或转换/验证的值 by getValue()

所以,

String selectedRadio = externalContext.getRequestParameterMap().get("formId:radioId");

或者

UIInput radio = (UIInput) viewRoot.findComponent("formId:radioId"); // Could if necessary be passed as component attribute.
String submittedValue = radio.getSubmittedValue(); // Only if radio component is positioned after input text, otherwise it's null if successfully converted/validated.
// or
String convertedAndValidatedValue = radio.getValue(); // Only if radio component is positioned before input text, otherwise it's the initial model value.
于 2012-08-16T02:15:02.897 回答
1

它被称为跨字段验证(验证不仅基于组件的值,还基于它们的集合)。

目前,JSF2 不支持它(JSF 不支持跨字段验证,有解决方法吗?)但是有几个库(在提到的问题omnifaces 中提到,看起来seamfaces 也有它的东西)可能帮助。在问题中还有一种解决方法。

于 2012-08-15T23:24:16.487 回答