将 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】:viewParam
是 UIComponent
。这意味着它在语义上与<h:commandButton/>
或<h:inputText/>
没有区别,并且它可能会通过每个规定的JSF 请求处理生命周期阶段,直到并包括验证和转换。事实上,标签本身会导致任何给定视图进入任何给定页面的完整处理,只需在那里
<p:commandButton/>
将执行回发,这意味着它将使用 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