我正在使用PrimeFaces SelectOneMenu,如下所示:
<p:selectOneMenu id="inviteAbleRoleSelect"
styleClass="dropDownSelector"
value="#{invitationManagedBean.selectedRole}">
<f:selectItems value="#{invitationManagedBean.inviteAbleRoles}"
var="role"
itemValue="#{role}"
itemLabel="#{localized[role.concat('RoleName')]}">
</f:selectItems>
</p:selectOneMenu>
以下JavaScript调用完成:
function handleUserInvitationRequest(xhr,status,args){
if (args.validationFailed) {
jQuery('#userInviterDialog').effect("shake", {
times : 3
}, 70);
} else {
userInviterDialogVar.hide();
refreshInvitedUserList();
}
}
当我提交表单时,我得到一个带正确填充表单的ajax POST,但是当它调用处理程序时,validationFailed为true,即使该元素不是必需的。此外,ajax响应中的更改会将select设置为空选择。
有什么想法吗?
答案 0 :(得分:1)
这是一个完全蹩脚的错误......
豆是@RequestScoped
......
至少需要@ViewScoped
。
答案 1 :(得分:0)
如果你的角色不是String或任何原始类型,那么你可能会得到Validation Error: Value is not valid
,因此你需要为你的角色实体/对象实现一个转换器,它就是这样的。
@FacesConverter("roleConverter")
public class RoleConverter implements Converter {
@Override
public Object getAsObject(FacesContext context,
UIComponent component,
String value) {
//prepare your datasource ex. EJB .. etc
if (value.trim().equals("")) {
return null;
} else {
Role role = datasource.findById(value); //get role from database
retun role;
}
}
@Override
public String getAsString(FacesContext context,
UIComponent component,
Object value) {
if (value == null || value.equals("")) {
return "";
} else {
return String.valueOf(((Role) value).getId());
}
}
}
selectOneMenu用于
<p:selectOneMenu id="inviteAbleRoleSelect"
styleClass="dropDownSelector"
value="#{invitationManagedBean.selectedRole}" converter="roleConverter">
<f:selectItems value="#{invitationManagedBean.inviteAbleRoles}"
var="role"
itemValue="#{role}"
itemLabel="#{localized[role.concat('RoleName')]}">
</f:selectItems>
</p:selectOneMenu>
您需要确保您的Role实现了equals和hashcode。