好吧,我有一个带有很多按钮的表单,当用户点击一个按钮时,必须在ManagedBean中执行一些方法,这是一个“疯狂”的逻辑。所以我有2个解决方案,我想知道你的建议:
<p:commandButton actionListener="#{myBean.someMethod}" value="Execute method 1" process="@this" />
public void someMethod(ActionEvent event){
if (selectedCustomer){
myCrazyLogicHere();
RequestContext.getCurrentInstance().update("formAlternative:componentToUpdate");
RequestContext.getCurrentInstance().execute("someAlternativeDialog.show()");
}else{
addErrorMessage("Select a Customer before click on Method 1");
}
}
<p:commandButton actionListener="#{myBean.someMethod}" update=":formAlternative:componentToUpdate" oncomplete="someAlternativeDialog.show()" value="Execute Method 1" />
public void someMethod(ActionEvent event){
if (selectedCustomer){
myCrazyLogicHere();
}else{
addErrorMessage("Select a Customer before click on Method 1");
}
}
所以,我在“第二个解决方案”中遇到了问题。当commandButton完成你的循环时,它将执行“someAlternativeDialog.show()”,我需要给它一个条件,如果“selectedCustomer”为真则只显示对话框。在“First Solution”中,这个问题已经解决,因为我在ManagedBean中做了所有事情,JSF只是调用该方法。
所以,我怀疑的是:最好的工作形式是什么?如果表单2更好,我该如何调整对话框显示?
答案 0 :(得分:1)
您不应该首先在动作方法中执行验证。您应该使用真正的验证器执行验证。例如,使用required="true"
<h:selectOneMenu value="#{myBean.selectedCustomer}" required="true"
requiredMessage="Select a Customer before click on Method 1">
...
</h:selectOneMenu>
使用true验证器验证失败时,JSF已经不会调用命令按钮的操作。通过这种方式,您可以删除整个if-else
块和addErrorMessage()
in action方法。如果验证失败,PrimeFaces将设置一个指标args
对象,其validationFailed
属性可以在oncomplete
中使用:
<p:commandButton ... oncomplete="if (!args.validationFailed) someAlternativeDialog.show()" />