【问题标题】:selectBooleanCheckbox doesn't initiate viewstate idselectBooleanCheckbox 不启动视图状态 ID
【发布时间】:2013-05-23 12:36:34
【问题描述】:

我有一个支持 bean,它是 ViewScoped。我在表单中启用了一些 ajax SelectBooleanCheckboxes。 示例:

<p:selectBooleanCheckbox value="#{formBean.value2}">  
    <p:ajax update=":theform"/>  
</p:selectBooleanCheckbox>

通常情况下,一些隐藏的输入字段应该在 html 中以通过 viewstate id。问题是那些没有在第一页请求上启动。当我单击其中一个复选框时,表单(以及复选框)会刷新。从这一刻起,视图状态 ID 将与这些复选框一起发送,因此可以保留视图状态。

其中最大的问题是在第一次 ajax 调用时会启动一组新的 ViewScoped bean,因此我丢失了有关第一个操作的数据。从那时起,一切似乎都正常了。

谁能告诉我可能是什么问题?

具体代码:

        <p:panel header="Schedule" toggleable="true">
            <form>
                <p:outputPanel id="schedule">
                    <ui:repeat var="scheduleDay" value="#{jobBean.jobScheduleDays}">
                        <div>
                            <p:selectBooleanCheckbox value="#{scheduleDay.selected}" style="margin:4px">
                                <p:ajax update=":schedule" />
                            </p:selectBooleanCheckbox>
                            <h:outputText value="#{scheduleDay.readableDay}" style="text-transform:capitalize"/>
                        </div>
                    </ui:repeat>
                </p:outputPanel>
            </form>
        </p:panel>

【问题讨论】:

  • 相关表单的父组件是否已由另一个 ajax 请求预先呈现?如果是这样,那么您的问题与stackoverflow.com/questions/2118656/… 的第 7 点相匹配请注意,这个具体问题与复选框完全无关,使用时您会遇到完全相同的问题,例如&lt;h|p:inputText&gt; 代替。
  • 不,事实并非如此。我已将我的代码添加到初始帖子中。您指向的修复程序不会立即帮助我。我找不到如何设置渲染属性(我认为它不可用?)。
  • 因此,您使用的是纯 HTML &lt;form&gt; 而不是 JSF &lt;h:form&gt;,这与该列表的第 1 点相矛盾?
  • 哦,是的,这导致了问题。页面的其他部分工作得很好,所以我经历了所有可能导致它的事情。我只是一直忽略这一点。非常感谢!

标签: jsf-2 primefaces


【解决方案1】:

您的问题是由使用纯 HTML &lt;form&gt; 而不是 JSF &lt;h:form&gt; 引起的。 &lt;h:form&gt; 不仅会生成正确的 HTML &lt;form&gt; 元素并设置正确的方法和操作 URL,而且还会生成两个额外的隐藏字段,用于标识正在提交的表单和 JSF 视图状态标识符。

例如

<h:form id="foo">

生成

<form id="foo" name="foo" action="ViewHandler#getActionURL()" method="post">
    <input type="hidden" name="foo" value="foo" />
    <input type="hidden" name="javax.faces.ViewState" value="..." />

(表单操作 URL 填充了ViewHandler#getActionURL() 的结果)

纯 HTML &lt;form&gt; 与 JSF ajax 请求一起使用是因为它们不完全使用表单元素来发送 HTTP POST 请求,而是使用 JavaScript 的 XMLHttpRequest 对象发送 HTTP POST 请求,其参数为通过使用 JavaScript 的 form.elements 遍历父表单中的输入元素来填充。 JSF ajax 响应将自动更新 JSF 视图状态隐藏字段,这就是 JSF 能够处理从第二个请求开始提交的表单的原因。

但是,使用纯 HTML &lt;form&gt; 在使用非 ajax 请求时会失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多