我有一些JSF页面有一个PrimeFaces对话框来创建Person
。因为这个对话框包含文件上传,所以我不想使用AJAX。创建Person
时将关闭该对话框。如果未创建Person
(验证失败或其他),则应显示对话框。
我见过人们使用visible="#{not empty facesContext.messages}"
执行此操作,但是我不能使用它,因为在任何情况下调用的方法都会返回FacesMessage
。
我现在的想法是生成一个视图参数(例如showDialog)并使用visible="#{param.showDialog}"
。
我尝试过使用导航案例,但由于从多个页面调用该方法,我无法创建只添加视图参数的通用导航案例。这就是这个想法:
<navigation-rule>
<from-view-id>*</from-view-id>
<navigation-case>
<from-action>#{personBean.create}</from-action>
<from-outcome>true</from-outcome>
<to-view-id>#{from-view-id}</to-view-id>
<redirect>
<view-param>
<name>showDialog</name>
<value>#{form-outcome}</value>
</view-param>
</redirect>
</navigation-case>
</navigation-rule>
使用导航案例的另一个问题是对话框是复合标记,并且使用属性提供操作。当我使用上面的导航案例时,我会收到一条消息Unable to find matching navigation case with from-view-id '/test.xhtml' for action '#{cc.attrs.saveAction}' with outcome 'true'
。
我认为最好/最简单的解决方案是在方法中添加view参数。但是,requestmap是不可变的,返回包含?showDialog=true
的String也不起作用。
答案 0 :(得分:0)
我不会使用导航规则处理它,而是使其类似于Login Example of the Primefaces Showcases。正如您所见,对话框在验证失败时保持打开状态,如果提交操作成功则关闭。
答案 1 :(得分:0)
我找到了一个没有视图参数的解决方案。
要提交表单我使用p:commandButton
此按钮使用AJAX。此按钮仅设置字段,验证字段并更新输入字段的容器。幸运的是,PrimeFaces会返回一个JavaScript值(args.validationFailed
),表示验证失败与否。
当我单击“保存”按钮时,字段将通过AJAX进行验证,从而保持对话框打开。验证通过后,我使用JavaScript单击非AJAX链接。
JSF:
<p:commandButton value="Save" update="containerOfValues"
oncomplete="afterValidation(xhr, status, args)" />
<p:commandLink ajax="false" action="#{cc.attrs.saveAction}"
style="display:none" binding="#{saveLink}" />
JavaScript的:
function afterValidation(xhr, status, args)
{
if (!args.validationFailed)
{
$("[id='#{saveLink.clientId}']").click();
}
}