有条件地在行动方法中显示对话框

时间:2013-09-13 12:32:13

标签: validation jsf primefaces

好吧,我有一个带有很多按钮的表单,当用户点击一个按钮时,必须在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更好,我该如何调整对话框显示?

1 个答案:

答案 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()" />