ui:repeat内p:selectOneMenu的f:selectItem如何传参获取值
问题原因
你遇到的报错是EL表达式的默认解析规则导致的:
- 写法
#{relationshipController.proceduresPerformedInAProcedureRoom}会被EL识别为读取Bean属性,会自动尝试调用无参的getProceduresPerformedInAProcedureRoom()方法,而你的后端方法是需要传入参数的有参方法,自然找不到对应属性抛出异常。 <f:param>标签仅适用于命令组件、AJAX请求等场景,放在<f:selectItems>标签内无法为值表达式传递参数,属于无效写法。
解决方案(主流JSF 2.0+ 兼容,依赖EL 2.2+ ,当前绝大多数应用服务器均默认支持)
直接在EL表达式的方法调用中传入参数,删除无效的<f:param>标签即可。
1. 修改JSF文件中第二个下拉的代码
<p:selectOneMenu id="prM" value="#{ii.addingItem.ci.itemValue}" > <f:selectItem itemLabel="Please select" /> <!-- 直接在方法括号中传入需要的参数 --> <f:selectItems value="#{relationshipController.proceduresPerformedInAProcedureRoom(ii.ci.institutionValue)}" var="li" itemLabel="#{li.displayName}" itemValue="#{li}"> </f:selectItems> </p:selectOneMenu>
2. 修正Controller中的笔误
你原有Controller代码中,方法形参名为procedureRoom,但查询时使用了未定义的institution变量,需要修正:
public List<Item> proceduresPerformedInAProcedureRoom(Institution procedureRoom){ // 把第一个参数改成你传入的procedureRoom List<Relationship> rs = findRelationships(procedureRoom, RelationshipType.Procedure_for_institution); List<Item> ps = new ArrayList<>(); for(Relationship r:rs){ ps.add(r.getItem()); } return ps; }
额外注意事项
因为你是在ui:repeat组件中使用该逻辑,只要第一个下拉的AJAX触发时ii变量作用域正常,第二个下拉的选项会随着你选择的手术室自动更新,符合你的动态需求。
内容的提问来源于stack exchange,提问作者Buddhika Ariyaratne
相关产品推荐
相关产品推荐

