一尘不染

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

ajax

我想分享我使用素数,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”无法解析)?

谢谢,我希望我的经验能使您避免花费大量时间进行调试!


阅读 295

收藏
2020-07-26

共1个答案

一尘不染

  1. viewParamUIComponent。这意味着它在语义上与a <h:commandButton/>或a 没有区别,<h:inputText/>并且有责任遍历每个指定的JSF请求处理生命周期阶段,直至并包括验证和转换。实际上,标签本身会使任何给定的视图进入任何给定页面的完整处理,

  2. <p:commandButton/>会做一个 回发 ,这意味着,这将是重新请求相同的观点,使用POST。因此,要解决您当前的问题,您需要根据这一事实确定所需的条件:

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

从新条件中得到的是,仅在首次请求时才需要该参数。随后的回发将不会触发该条件。只需确定您没有任何逻辑即可(也许是基于@PostConstruct这种期望而建立的

2020-07-26