PrimeFaces布局和h:表单

时间:2017-08-02 11:18:12

标签: html jsf primefaces jsf-2

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之外只有一个表单标签的方法可以在某个时间点引起问题吗?

1 个答案:

答案 0 :(得分:1)

PrimeFaces文档确实在Page 309 of the 6.1 documentation

上声明
  

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

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

他们还说明了

  

布局单元必须具有它自己的形式,同时避免因同样的原因尝试更新布局单元,而是更新它的内容。

'必须'(强调以上是我的)在这里强,他们最好说明

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

完整页面布局周围的完整表单现在可以正常工作,假设布局不会弄乱事物,例如将部分添加到周围的body标记中(如果它确实执行dom操作以实现某种行为),但我怀疑它们会给你保证。不像你问的那样做的另一个原因可能是,当“部分页面”的开发人员不完全了解'god form'时,你可能会遇到嵌套表单。所以我会反对它。

所以,例如,北部和南部布局单元包含一些固定功能(带有搜索的页眉,带有一些功能的页脚),然后将h:form直接放在布局单元中。如果中心部分包​​含动态内容,例如a ui:include,将`h:表单放在包含的部分中。

另见: