PrimeFaces中p:confirmPopup内p:inputText值无法传入后端Bean解决方法
是否可以在p:confirmPopup内使用p:inputText
完全可以,输入值无法传递到后端是配置错误导致的,不属于组件本身的功能限制。
核心错误点
- 弹窗内的提交按钮设置了
type="button",该类型按钮不会触发表单提交,输入框的值根本不会发送到服务端。 - 业务方法
releaseHoldOrder错误绑定在了DataTable中触发弹窗的按钮上,方法会在弹窗弹出瞬间就执行,此时用户还未输入密码,属性值必然为空。 - 全局confirmPopup默认的确认按钮逻辑仅会触发源按钮的动作,不会处理弹窗内自定义输入组件的提交逻辑,直接沿用默认逻辑无法传递输入值。
- 输入框上添加的
immediate="true"属于冗余配置,会干扰JSF正常的生命周期值处理流程,无实际作用。
可直接落地的修复方案
1. 修改DataTable内的触发按钮
移除按钮上直接绑定的业务方法,仅保留弹窗触发逻辑:
<p:dataTable id="datalist" value="#{purchaseOrderDetailFileController.heldOrderList}" var="item" selectionMode="single" selection="#{purchaseOrderDetailFileController.selected}" paginator="true" rowKey="#{item.id}" tableStyle="width:auto" rows="10" rowsPerPageTemplate="10,20,30,40,50"> <p:column style="width:6rem"> <p:commandButton value="Release" icon="pi pi-check" styleClass="rounded-button p-mr-2 p-mb-2"> <p:confirm type="popup" header="Release Password" message="Please Provide Release Password" icon="pi pi-exclamation-triangle"/> </p:commandButton> </p:column> <p:column > <f:facet name="header"> <h:outputText value="Hold Code"/> </f:facet> <h:outputText value="#{item.purchaseOrderHeader.holdOrdersCode}"/> </p:column> </p:dataTable>
2. 修改p:confirmPopup配置
移除输入框的冗余属性,将业务方法绑定到弹窗内的提交按钮上,明确指定提交处理范围:
<p:confirmPopup global="true"> <p:inputText id="password2" value="#{purchaseOrderDetailFileController.orderReleasePassword}"/> <p:spacer width="10"/> <p:commandButton value="Submit" styleClass="ui-confirm-popup-yes" action="#{procurementModule.releaseHoldOrder(purchaseOrderDetailFileController.selected)}" process="@this,password2" update="datalist, :growl"/> <p:commandButton value="Cancel" styleClass="ui-confirm-popup-no" type="button"/> </p:confirmPopup>
注意:如果p:confirmPopup组件放在
<h:form>标签外部,需要给弹窗单独嵌套表单,否则输入值无法提交。
3. 简化后端Bean方法
不需要手动通过ELContext解析Bean实例,JSF会自动完成输入值到Bean属性的绑定:
public void releaseHoldOrder(PurchaseOrderDetailFile item) { try { // 直接通过当前Bean的getter获取输入的密码 String password = this.getOrderReleasePassword(); // 后续编写密码校验、订单释放业务逻辑即可 } catch(Exception e){ e.printStackTrace(); } }
内容的提问来源于stack exchange,提问作者Alazar
相关产品推荐
相关产品推荐

