我想分享我使用素数,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,您将看不到此消息,则必须挖掘素语在ajax调用中发送的XML。其次,经过4个小时的调试,我试图像这样更改f:viewParam:
<f:viewParam name="id_file" value="#{bean.idFile}" />
无需“必填”:神奇的是,一切开始工作,我可以单击1,2,3等,并且每次都调用myMethod。因此,问题在于ajax提交验证了用f:viewParam指定的参数,这对我来说听起来很愚蠢,但是好的,我可以接受它。
我的问题是:
为什么在第一次单击按钮时没有出现此验证错误?如果您查看Ajax POST,它们是相同的
在部分ajax调用中验证视图参数(按照我的想法,属于视图)应该可以吗?
有没有办法告诉Primeface不在特定的Ajax请求上进行验证(process =“ @ this”无法解析)?
谢谢,我希望我的经验能使您避免花费大量时间进行调试!
该viewParam是UIComponent。这意味着它在语义上与a <h:commandButton/>或a 没有区别,<h:inputText/>并且有责任遍历每个指定的JSF请求处理生命周期阶段,直至并包括验证和转换。实际上,标签本身会使任何给定的视图进入任何给定页面的完整处理,
viewParam
UIComponent
<h:commandButton/>
<h:inputText/>
该<p:commandButton/>会做一个 回发 ,这意味着,这将是重新请求相同的观点,使用POST。因此,要解决您当前的问题,您需要根据这一事实确定所需的条件:
<p:commandButton/>
<f:viewParam required="#{!facesContext.postback}" name="id_file" value="{bean.idFile}"/>
从新条件中得到的是,仅在首次请求时才需要该参数。随后的回发将不会触发该条件。只需确定您没有任何逻辑即可(也许是基于@PostConstruct这种期望而建立的
@PostConstruct