JSF:在验证成功或失败时有条件地更新

Posted

技术标签:

【中文标题】JSF:在验证成功或失败时有条件地更新【英文标题】:JSF: Update conditionally on Success or failure of validations 【发布时间】:2012-06-18 11:34:35 【问题描述】:

在我的 JSF 应用程序中,我试图在我的命令按钮更新属性中添加一些条件,以便在验证失败/成功时我可以控制组件进行更新。

参考PrimeFaces: conditional update on validation我尝试使用

<p:commandLink process="@form" listener="#foo" 
  update="somethingElse" oncomplete="if (!args.validationFailed) $("#link").click();">
<p:commandLink style="display:none" id="link"
  update="something">

但我不知道为什么这种方法对我不起作用..该特定组件的单击事件对我不起作用..我尝试执行相同问题的已接受答案,但我不明白如何那就是解决目的……

我的目的是根据验证成功或失败的结果有条件地更新...支​​持我有 3 个组件 X Y Z..我正在尝试做这样的事情..

<p:commandLink process="@form" listener="#foo" 
      update="if(Validation fail)updateSomething[e.g X and Y] **else** update somethingelse[e.g X  Y and Z]">

更准确地说,如果验证失败,那么我只想在验证成功时更新 X 和 Y 组件,而不是更新 X Y 和 Z 组件。

请帮帮我.. 提前致谢。

【问题讨论】:

【参考方案1】:

第一个问题是您使用的 EL 语法无效。通过在 javascript 代码中使用 " 而不是 ',您过早地关闭了属性值。要么使用\" 转义嵌套引号,要么只使用'

<p:commandLink process="@form" listener="#foo" update="somethingElse" 
    oncomplete="if (!args.validationFailed) $('#link').click();">

第二个可能的问题是&lt;p:commandLink id="link"&gt;的客户端ID根本不是"link"。默认情况下,它前面带有父 &lt;h:form&gt; 组件的 ID。客户端 ID 是 JSF 生成的 html 元素 ID。在 webbrowser 中打开页面,右键单击并 查看源代码 自己查看。它看起来像id="formId:link"。您需要在 jQuery 选择器中准确使用该 ID。

<p:commandLink process="@form" listener="#foo" update="somethingElse" 
    oncomplete="if (!args.validationFailed) $('#formId\\:link').click();">

另见:

How to select JSF components using jQuery?

另一种方法是在listener="#foo" 后面的方法中执行具体工作。

if (!facesContext.isValidationFailed()) 
    RequestContext.getCurrentInstance().update("somethingElse");

【讨论】:

我会更喜欢第二种方法而不是 jquery 方法......是的,我可以使用上面的代码从 java 代码更新,但我将如何停止更新而不是我在 .xhtml 上指定的......是有办法在 xhtml 端应用一些条件..?? @balausC 你也可以使用 来解释你在上面提到的问题链接中解释的方法 如果唯一的目的是显示面孔消息,只需使用与链接中答案相同的方法。将oncomplete="if (!args.validationFailed) $('#link').click();" 替换为update="messages" 我对此答案的编辑被拒绝了-虽然不完全知道为什么-但是在代码示例中,代码无法编译,因为该方法不是称为validationFailed(),而是isValidationFailed() . validationFailed() 返回 void 而不是 boolean【参考方案2】:

我尝试了标记的答案,但它没有解决我的问题,因为 args 不包含名为“validationFailed”的参数,但是我找到了从控制器添加此参数的方法。

 import org.primefaces.context.RequestContext;

 RequestContext requestContext = RequestContext.getCurrentInstance();
 requestContext.addCallbackParam("validationError", true);
 JSFUtils.displayErrorMessage("My message is here!");

& 在 xhtml 中我添加了以下命令链接

 <p:commandLink ajax="true" action="#myController.myMethod"
 oncomplete="if(args.validationError) alert('Error!');"/>

【讨论】:

也许您使用的是侏罗纪版本的 PrimeFaces? IIRC 它已经在 3.x 中了。 事实上,我使用的是 primefaces 4.0,但如果不使用 primefaces RequestContext 自己添加参数,我仍然无法使用该解决方案。

以上是关于JSF:在验证成功或失败时有条件地更新的主要内容,如果未能解决你的问题,请参考以下文章

仅在第一个组件通过验证时有条件地更新第二个组件

具有渲染属性的jsf组件验证失败

JSF 2.1 条件字段验证

当jsf验证失败时,跳过ajax

域控制器升级的先决条件验证失败.

有条件地从 AppDelegate 故事板中的不同位置开始