Primefaces文档声明以下代码无效,因为每个layoutUnit都需要自己的形式:
<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之外只有一个表单标签的方法可以在某个时间点引起问题吗?
答案 0 :(得分:1)
PrimeFaces文档确实在Page 309 of the 6.1 documentation
上声明使用表单和整页布局时,请避免使用包含layoutunits的表单,因为生成的dom可能不一样。以下是 的无效强>
并且他们引用了你的第一个例子。它在技术上并非无效,但是由于布局组件呈现浏览器中所需的html(可能是客户端进行dom操作)以获得良好的整页体验,它可能(将会自己从未尝试过)导致意外行为。
他们还说明了
布局单元必须具有它自己的形式,同时避免因同样的原因尝试更新布局单元,而是更新它的内容。
'必须'(强调以上是我的)在这里强,他们最好说明
如果布局单元中需要表单,则为每个布局单元提供自己的表单。
完整页面布局周围的完整表单现在可以正常工作,假设布局不会弄乱事物,例如将部分添加到周围的body
标记中(如果它确实执行dom操作以实现某种行为),但我怀疑它们会给你保证。不像你问的那样做的另一个原因可能是,当“部分页面”的开发人员不完全了解'god form'时,你可能会遇到嵌套表单。所以我会反对它。
所以,例如,北部和南部布局单元包含一些固定功能(带有搜索的页眉,带有一些功能的页脚),然后将h:form
直接放在布局单元中。如果中心部分包含动态内容,例如a ui:include
,将`h:表单放在包含的部分中。
另见: