2012-09-08 156 views
0

我有几个JSF页面有一个PrimeFaces对话框来创建一个Person。由于此对话框包含文件上传,我不想使用AJAX。当创建Person时,该对话框将被关闭。如果没有创建Person(验证失败或其他),则应显示该对话框。在非Ajax请求后保持对话框打开

我见过人们用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'

我认为最好/最简单的解决方案是在该方法中添加视图参数。然而,requestmap是不可变的,返回一个包含?showDialog=true的字符串也不起作用。

回答

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(); 
    } 
} 
0

我不会用导航规则处理它,而是使它与Login Example of the Primefaces Showcases类似。正如你所看到的那样,当验证失败时对话框保持打开状态,如果提交操作成功则关闭对话框。

+0

的例子,我的情况之间的主要区别是,我没有使用AJAX。否则我不会在这里发布问题;-) – siebz0r

相关问题