表单值未提交,在ajax

时间:2016-04-19 12:40:06

标签: ajax jsf primefaces

在我当前的项目中,我有一个构造,您可以在其中通过批准工作流程更改值。 如果要保存实体的新版本,请单击按钮,弹出对话框。在那里,您可以设置一个批准您的更改和另一个可选的评论。

我的问题是,此对话框中的值未提交。

该对话框包含在我的主模板中,但在主窗体之外。该对话框附加到Body,如下所示:

<p:dialog id="idEntityCommentDialog"
        header="#{msgs['label.approval.dialogHeader.'.concat(bean.targetStatus)]}"
        width="350" widgetVar="entityCommentDlg" modal="true"
        maximizable="false" resizable="false" appendTo="@(Body)">

两个字段都将其值设置为sessionScoped辅助bean内的对象:

<p:selectOneMenu id="selUsers"
    value="#{bean.state.releasedBy}" style="width: 100%">
    <f:selectItems value="#{bean.fetchUserList()}" var="user"
        itemValue="#{user.id}"
        itemLabel="#{user.name}" />
</p:selectOneMenu>

<p:inputTextarea id="changeComment"
    value="#{bean.state.newComment.eventDescription}"
    style="width: 98%; height: 100px">
    <f:converter converterId="xssConverter" />
</p:inputTextarea>

之前,我有标准的jsf控件,h:sekectOneMenu和h:inputTextArea。我已切换到相应的primefaces控件,现在至少提交了selectOneMenu的值,但仍然没有提交inputTextarea的值。我在二手转换器中设置了断点,我在转换器中收到一个空字符串,它在我使用它的其他地方工作。

我尝试了各种更新参数组合,并尝试通过

在ajax请求中设置值
<p:ajax event="change" update="@this">

当我使用p:ajax标签时,我可以看到,当我更改值时,在ajax请求之后,该值会立即重置为更改前的原始值。这适用于两个字段(当使用标准控件时)就像我说的,我用primefaces控件修改它(我不明白为什么,但它似乎工作)但它不适用于inputTextArea。

我的按钮插入了来自primefaces的工具栏面。

<p:commandButton actionListener="#{bean.saveEntity}"
    styleClass="toolbarButton" update="dialogForm2 :blocker:contentWrapper"
    onstart="PF('waitDialog').show();"
    oncomplete="PF('waitdialog').hide();PF('entityCommentDlg').hide();"
    value="#{msgs['label.approval.button.'.concat(bean.targetStatus)]}">
</p:commandButton>

表单在对话框中定义,只有一个id:

<h:form id="dialogForm2">

我很困惑,如果我使用p:ajax控件,我的值会立即重置,所以这里肯定会有一些错误。

我还检查过我没有失败的验证,我可能由于某种原因没有看到(通过phaseListener),但事实并非如此,没有facesMessages出现。

请尊重我无法向您展示项目中的完整代码块,我的客户不希望这样,但如果您需要有关其他代码或架构的更多信息,我将尽力提供。我还更改了一些ID和名称,但我确保它们是正确的,并在原始代码中正确引用。

你知道这种行为的原因是什么? 我知道有关于未提交的表单值的各种文章,我已经看过它们并尝试了解决方案,但似乎没有什么对我有用。我的一位同事也不知道它为什么不起作用。我在应用程序的另一部分使用几乎相同的构造(使用不同的支持bean和对象),在那里,一切正常,使用标准的jsf控件。

1 个答案:

答案 0 :(得分:0)

好的,我终于找到了问题。解决方案是删除appendTo =“@(Body)”

在找到解决方案之前,我的行为非常奇怪。

您会看到,在提交按钮的onStart和onComplete事件中,我显示了加载叠加层。当我修复这个loadingOverlay时发生了这个错误。在我有复制和粘贴错误之前,我引用了错误的加载叠加层,这在当前页面中不存在。但是只有在我使用正确的叠加层时才会出现错误,或者我甚至完全删除了对此叠加层的引用。当我再次输入错误的覆盖ID时,它有效......

现在,当我删除appendTo属性时,一切似乎都能正常工作,即使是正确的加载叠加层也是如此。我甚至不知道为什么我使用了appendTo属性。我假设对话框之前在另一个地方,我不得不使用它,但同时对话框直接放在文档的正文中,在任何布局或表单之外,所以我知道我不需要它。

有人对此错误发生的原因有更深入的了解吗?我知道,当你不需要使用它时,appendTo可能会产生副作用,但我在这里可以观察到的一般行为对我来说是无关紧要的。