PrimeFaces Layout and h:form



Primefaces 文档指出,由于每个布局单元都需要自己的表单,因此以下代码将无效:

<p:layout fullPage="true">
<h:form> 
<p:layoutUnit position="north">
<p:inputText value="#{testBean.input1}" />
</p:layoutUnit>
<p:layoutUnit position="center">
<p:inputText value="#{testBean.input2}" />
<p:commandButton value="save" action="#{testBean.save}" />
</p:layoutUnit>
<p:layoutUnit position="south">
<p:inputText value="#{testBean.input3}" />
</p:layoutUnit>
</h:form> 
</p:layout>

但是,当我在表单中嵌套 p:layout 时,代码可以毫无问题地工作:

<h:form>
<p:layout fullPage="true">
<p:layoutUnit position="north">
<p:inputText value="#{testBean.input1}" />
</p:layoutUnit>
<p:layoutUnit position="center">
<p:inputText value="#{testBean.input2}" />
<p:commandButton value="save" action="#{testBean.save}" />
</p:layoutUnit>
<p:layoutUnit position="south">
<p:inputText value="#{testBean.input3}" />
</p:layoutUnit>
</p:layout>
</h:form>

这种行为的解释是什么?我在 p:layout 之外只有一个表单标签的方法会在某个时间点引起问题吗?

PrimeFaces 文档确实在 6.1 文档的第 309 页上进行了说明

使用表单和整页布局时,请避免使用包含布局单元的表单,因为生成的 dom 可能不同。 所以以下是无效

在这一点上,他们引用了你的第一个例子。从技术上讲,它不是无效的,但由于布局组件呈现浏览器中所需的html的方式(也许客户端会进行dom操作(以获得良好的整页体验,它可能会(将?从未尝试过自己(导致意外行为。

他们还声明

布局单元

必须具有自己的表单,也避免出于同样的原因尝试更新布局单元,而是更新其内容。

"必须有"(上面的强调是我的(在这里很强大,他们最好说

如果布局单元中需要表单,请为每个布局单元提供自己的表单。       

假设布局不会弄乱事物,例如将部分添加到周围的body标签(如果它确实执行 dom 操作以实现某种行为(,那么围绕整页布局的完整表单现在可能会起作用,但我怀疑他们会给你保证。不按照您的要求这样做的另一个原因可能是,当"部分页面"的开发人员不完全了解"上帝形式"时,您可能会遇到嵌套表单。所以我建议不要这样做。

因此,如果例如,南北布局单元包含某种固定功能(带有搜索的页眉,带有某些功能的页脚(,则直接在布局单元中放置一个h:form。如果中心部分包含动态内容,例如ui:include,请将'h:form放在包含的部分。

另请参阅:

  • 如何在JSF页面中使用<h:form>?单一形式?多种形式?嵌套表单?
  • 如何通过导航菜单刷新动态包含内容?(JSF SPA(

最新更新