【问题标题】:Validate fields before open the new window在打开新窗口之前验证字段
【发布时间】:2013-10-11 20:07:24
【问题描述】:

我有这个命令按钮:

<p:commandButton action="#{reportBB.createReport}" ajax="false" id="createReport" onclick="form.target='_blank'" value="#{msg['create.report']}" />

这会打开一个新页面并加载一个 pdf 报告。它总是打开新页面,然后验证必填字段。我需要先验证所有必填字段是否已填写,然后打开新页面。

这可能吗?我能做什么?

【问题讨论】:

  • 您需要 2 个 UICommands: 1 来触发字段验证。如果所有验证都通过,这将调用第二个 UICommandtarget="blank",这将执行您的实际操作 "#{reportBB.createReport}"
  • @LuiggiMendoza 我真的不知道该怎么做。你能举个例子吗?
  • @JohnB - 您是否打算在验证失败时停止 pdf 加载?如果这样做,请在所需字段上设置 immediate="true"
  • 不,我需要先验证必填字段,如果必填文件已填写,则使用 pdf 文件打开新窗口

标签: jsf primefaces commandbutton


【解决方案1】:

您首先需要将onclick 改为使用oncomplete。然后将它的执行与请求变量的验证状态联系起来:

<p:commandButton action="#{reportBB.createReport}" ajax="false" id="createReport" oncomplete="if (!args.validationFailed){form.target='_blank'}" value="#{msg['create.report']}" />

您必须切换到oncomplete 的原因是oncomplete 在处理JSF 请求之后运行,至少到验证/转换阶段。在验证阶段设置请求的状态,它基于您将显示 PDF 的状态。出于同样的原因,onclick 为时尚早。

args 对象是携带一些有用信息的 PF 对象。我上面的 sn-p 询问它以获取请求的验证状态。

我相信这是您问题的核心。关于实际验证我认为您的表单中的多个字段的一些提示:

  1. 最简单的方法是在您正在验证的输入组件上设置immediate="true"。这样,如果验证失败,则永远不会调用命令按钮的操作。您只需确保命令按钮与输入组件的形式相同。

  2. 您可以使用omnifaces validateAll 组件在一处验证多个字段

  3. 另一种方法是禁用命令按钮并在表单中的所有字段都通过验证后启用 ajax。

【讨论】:

  • 我按照您的建议将 onclick 属性更改为 oncomplete,但验证通过后它不会打开新窗口。您提到的第一点 (immediate="true") 失败,因为我的输入组件依赖于 oneselectmenu,并在尝试加载另一个 oneselectmenu 组件中的信息时抛出 NullPointerException。我试图做第三点,但我做不到。我是JSF的新手,我不知道如何做好。第二点我还没试过
  • 我通过您的努力支持了您的回答。你能帮我吗
  • @JohnB - 让我正确理解你,呈现 pdf 的目标页面在哪里?我的意思是,您是否在createReport 中返回导航箱?顺便说一句,导航没有发生的原因是因为您不允许有条件地更改表单的目标呈现视图之后。所以form.target='blank' 在命令按钮中是非法的
  • 如果必填项填写,目标页面是另一个页面(_blank),如果不是我的新页面(_blank)不应该打开
  • @JohnB - 那么你根本不需要使用onclickoncomplete。只需更改createReport 方法以返回与您尝试导航到的页面相对应的String 结果。然后在您的&lt;h:form/&gt; 中设置target="_blank"。您还将字段设置为 required="true" 对吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
  • 2018-11-25
  • 1970-01-01
  • 2014-09-11
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
相关资源
最近更新 更多