JSF ViewParam 必需 +AJAX 中断页面
Posted
技术标签:
【中文标题】JSF ViewParam 必需 +AJAX 中断页面【英文标题】:JSF ViewParam Required +AJAX breaks page 【发布时间】:2012-12-11 04:36:28 【问题描述】:当我单击下面页面上的命令按钮时,导航失败。 (点击按钮刷新页面,移除 URL 参数并显示所需的错误消息,而不是导航到索引页面)
但是,如果我删除必需的属性或删除 f:ajax 标记,导航工作正常。
使用 com.sun.faces JSF 2.1.13 和 primefaces 3.4。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head></h:head>
<f:metadata>
<f:viewParam name="product"
required="true" requiredMessage="Bad request. Please use a link from within the system."/>
</f:metadata>
<body>
<h:form id="form">
<h:selectBooleanCheckbox>
<f:ajax update="form" />
</h:selectBooleanCheckbox>
<h:commandButton value="buy" action="/index.xhtml?faces-redirect=true" />
</h:form>
</body>
</html>
【问题讨论】:
【参考方案1】:我会假设 update="form"
是粗心的过度简化,而您实际上打算使用 render="@form"
并将其与 PrimeFaces 混淆。
回到具体问题,这是由执行非 ajax 回发引起的,该回发也会触发视图参数的处理。
要么只在非回发时才需要它(但要确保 bean 是视图范围的),
<f:viewParam ... required="#not facesContext.postback" />
或者在回发时也传递它
<h:commandButton ...>
<f:param name="product" value="#bean.product" />
</h:commandButton>
如果您已经在使用视图范围的 bean,请改用 OmniFaces <o:viewParam>
。它不会处理回发时的视图参数。
<... xmlns:o="http://omnifaces.org/ui">
...
<o:viewParam ... />
【讨论】:
我发现第一个选项仍然会导致我的实际页面出现问题,这有点复杂。以上是关于JSF ViewParam 必需 +AJAX 中断页面的主要内容,如果未能解决你的问题,请参考以下文章
JSF 2.0 AJAX:使用 jsf.ajax.request(或其他方式)从 javascript 调用 bean 方法
将带有 Ajax4jsf 1.x 的 JSF 1.1 迁移到 JSF 2