将 f:viewParam 与必需的属性和命令一起使用

Posted

技术标签:

【中文标题】将 f:viewParam 与必需的属性和命令一起使用【英文标题】:using f:viewParam with required attribute and commands 【发布时间】:2014-02-08 22:26:23 【问题描述】:

我想分享我使用 primefaces、f:viewParam 和 p:commandButton 的经验,并提出几个问题。看看这个页面:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:p="http://primefaces.org/ui">
  <h:head></h:head>
  <h:body>  
    <f:metadata>
      <f:viewParam required="true" name="id_file" value="#bean.idFile" />
    </f:metadata>
    <h:form id="tableform" prependId="false">              
      <p:commandButton actionListener="#bean.myMethod())" icon="ui-icon-search" title="View" />
    </h:form>
    <p:messages id="messages" showDetail="true" autoUpdate="true" closable="true" />      
  </h:body>
</html>

支持 bean 有一个什么都不做的“myMethod()”方法。当您进入页面时,它需要“id_file”参数并将其放在支持 bean 的 idFile 属性中。然后单击按钮并调用 myMethod。然后你再次点击,你会得到一个模糊的验证错误,并且 myMethod 永远不会被调用:

j_idt1: Validation Error: Value is required.j_idt1: Validation Error: Value is required.

首先,请记住,如果没有 p:messages,您将看不到此消息,您必须挖掘 primefaces 在 ajax 调用上发送的 XML。其次,经过 4 小时的调试后,我尝试像这样更改 f:viewParam:

<f:viewParam name="id_file" value="#bean.idFile" />

没有“必需”:神奇地一切都开始工作,我可以单击 1、2、3 等,并且每次都会调用 myMethod。所以,问题是 ajax 提交验证了用 f:viewParam 指定的参数,这对我来说听起来很傻,但是好的,我可以忍受它。

我的问题是:

为什么在第一次单击按钮时不会出现此验证错误?如果您查看 ajax POST,它们是相同的

应该可以在部分 ajax 调用中验证视图参数(在我的想法中,它属于视图)?

有没有办法告诉 primefaces 不要验证特定的 ajax 请求(process="@this" 无法解析)?

谢谢你,我希望我的经验能让你避免花费数小时进行调试!

【问题讨论】:

【参考方案1】:

    viewParamUIComponent。这意味着它在语义上与&lt;h:commandButton/&gt;&lt;h:inputText/&gt; 没有区别,并且它可能会通过每个规定的JSF 请求处理生命周期阶段,直到并包括验证和转换。事实上,标签本身会导致任何给定视图进入任何给定页面的完整处理,只需在那里

    &lt;p:commandButton/&gt; 将执行回发,这意味着它将使用 POST 重新请求相同的视图。因此,要解决您当前的问题,您需要根据该事实确定您所需的条件:

    <f:viewParam  required="#!facesContext.postback" name="id_file" value="bean.idFile"/>
    

    您从新条件中得到的是该参数仅在第一个请求时才需要。随后的回发不会触发该条件。只要确保您没有任何逻辑(也许在围绕该期望构建的@PostConstruct

【讨论】:

谢谢 kolossus,它现在按我的预期工作。但我仍然想知道为什么第一个按钮单击不会产生任何验证错误,我的意思是,在第一个 ajax 调用中我也没有“id_file”,或者没有? @moretti.fabio - 不完全确定,对我来说似乎很奇怪。您是否从另一个页面导航到该页面?还是重新加载页面? 我尝试从零开始加载页面,从其他页面加载并使用 ctrl+f5 刷新页面,结果始终相同:第一次点击有效,后续点击无效。

以上是关于将 f:viewParam 与必需的属性和命令一起使用的主要内容,如果未能解决你的问题,请参考以下文章

当 URL 中没有参数时,将 f:viewParam 属性设置为 null

根据 f:viewParam 有条件地调用 f:viewAction

f:viewParam 具有多个值

如何在不调用 <f:viewparam> 转换器的情况下调用 setter?

f:viewParam 在 ajax 调用后丢失

何时调用 <f:metadata><f:viewParam> 的设置器