我一直在Creating master-detail table and dialog, how to reuse same dialog for create and edit 和Understanding PrimeFaces process/update and JSF f:ajax execute/render attributes关注@BalusC示例,尝试获取一个小表单来编辑某些数据,然后继续。但是,当我尝试保存数据时,我无法看到支持bean中反映的更改。
我有一个简单的表单,我预先填充了一些数据,我可以在保存之前进行编辑:
<h:form id="productSummaryForm">
<h:panelGrid columns="2" columnClasses="label, value">
<h:outputText value="Product name:" />
<p:inputText id="productNameInputText" value="#{editProduct.product.productName}" required="true" requiredMessage="Enter Product Name" size="32">
<p:watermark value="The name of the product" for="productNameInputText"/>
</p:inputText>
<h:outputText value="Output name:" />
<p:inputText id="outputNameInputText" value="#{editProduct.product.outputName}" size="32">
<p:watermark value="Output name" for="outputNameInputText"/>
</p:inputText>
</h:panelGrid>
<h:panelGrid columns="3" styleClass="buttonPanelGrid">
<p:commandButton value="Cancel" immediate="true" action="#{productController.cancel}"/>
<p:commandButton id="saveButton" value="Save" process="@this" immediate="true" action="#{editProduct.saveProduct}"/>
</h:panelGrid>
</h:form>
控制器是:
@Named
@ViewScoped
public class EditProduct implements Serializable {
private Product product; // JPA Entity
@Inject
protected ProductService productService;
public String saveProduct() {
productService.saveProduct(product);
return "/product?faces-redirect=true";
}
}
当我在saveProduct()
上进行调试时,我通过用户界面制作的所有修改都没有反映在我保存的product
中。我已尝试将inputText
ID添加到process
属性(例如process="@this outputNameInputText"
),但仍未反映这些更改。
我在saveButton
上尝试的不同属性组合都没有改变任何内容,这让我觉得Product
是问题所在:它是一个JPA实体。听起来不错吗?
答案 0 :(得分:0)
因此, 在我的某个组件上出现了验证错误,我通过commandButton/commandLink/ajax action/listener method not invoked or input value not set/updated中的列表找到了该错误。在完成此过程和Understanding PrimeFaces process/update and JSF f:ajax execute/render attributes 的过程中,我发现有多种方法可以完成我需要的工作:
依赖于默认的PrimeFaces process="@form"
行为:
<p:commandButton id="saveButton" value="Save" action="#{editProduct.saveProduct}"/>
或者,只是为了明确:
<p:commandButton id="saveButton" value="Save" process="@form"
action="#{editProduct.saveProduct}"/>
只处理PrimeFaces方式的某些表单字段:
<p:commandButton id="saveButton" value="Save"
process="@this outputNameInputText productNameInputText"
action="#{editProduct.saveProduct}"/>
并且,在没有PrimeFaces的情况下这样做:
<h:commandButton id="saveButton" value="Save" action="#{editProduct.saveProduct}">
<f:ajax execute="@form" render="@all"/>
</h:commandButton>