当我从h:selectOneMenu更改选择时,它正确地在h:inputtext上呈现输出。 当我没有选择任何仍显示最后选择的任何内容时,会出现问题, 当选择“选择国家/地区”时,我不想在inputtext上显示任何内容
<h:selectOneMenu id="country_id" value="#{countryBean.countryCode}" >
<f:validator for="country_id" validatorId="countryNameValidator"/>
<f:selectItem itemLabel="Select Country" itemValue=" "/>
<f:selectItems value="#{countryBean.countryList}" var="countryDTO" itemLabel="#{countryDTO.countryName}(#{countryDTO.countryCode})" itemValue="#{countryDTO.countryCode}"/>
<f:ajax event="change" render="countryCodeValue" execute="@this" listener="#{countryBean.setCountryCodeData}"></f:ajax>
</h:selectOneMenu>
<h:inputText disabled="true" value="#{countryBean.countryCode}" id="countryCodeValue" required="true" >
</h:inputText>
customCountryNameValidator.java
package com.mcd.webex.custom.validation;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.validator.FacesValidator;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;
@FacesValidator(value="countryNameValidator")
public class CustomCountryValidator implements Validator{
@SuppressWarnings("unused")
public void validate(FacesContext fContext, UIComponent uiComponent, Object value)throws ValidatorException {
String countryCode = (String) value;
System.out.println("from Country Validation message:"+countryCode);
FacesContext fc = FacesContext.getCurrentInstance();
System.out.println("Country Code length: "+countryCode.trim().length());
if(null != countryCode && countryCode.trim().length() == 0){
FacesMessage message = new FacesMessage("Country validation failed.","Please select country.");
message.setSeverity(FacesMessage.SEVERITY_ERROR);
throw new ValidatorException(message);
}else if(null == countryCode){
FacesMessage message = new FacesMessage("Country validation failed.","Please select country.");
message.setSeverity(FacesMessage.SEVERITY_ERROR);
throw new ValidatorException(message);
}
}
}
答案 0 :(得分:0)
你的countryNameValidator
是罪魁祸首。如果在提交表单期间验证失败,则不会更新模型值。这完全解释了为什么您一直看到最后成功选定的值。如果您已向表单添加<h:messages id="messages"/>
并将其id
添加到<f:ajax render>
,那么您应该看到验证错误消息。
现在,我检查了你的验证器。它实际上没有任何意义。它似乎与JSF内置required="true"
验证器已经在做的完全相同。也许您创建它是为了防止提交“请选择”的空白值。这真的没意义。只需使用null
或空字符串作为“请选择”值并坚持required="true"
。然后你可以完全删除那个验证器。
然而,这并不能解决最初的问题:更改下拉列表并更新关联的文本元素时出现验证错误。如果您已将验证器更改为required="true"
,那么这实际上更容易解决。只有在按下真实提交按钮时,才允许required
属性评估true
。这是一个启动示例:
<h:selectOneMenu ... required="#{not empty param[submit.clientId]}">
<f:selectItem itemLabel="Select Country" itemValue="#{null}" />
<f:selectItems ... />
<f:ajax listener="#{countryBean.setCountryCodeData}" render="countryCodeValue" />
</h:selectOneMenu>
<h:inputText id="countryCodeValue" ... />
...
<h:commandButton binding="#{submit}" ... />
(请注意event
的{{1}}和execute
属性已经具有正确的默认值;我省略了它们