jsf - p :commandbutton action doesn't work inside p:dialog

标签 jsf primefaces dialog commandbutton

我有一个 p:dialog,里面有一个面板。问题是“保存”按钮的操作方法不起作用。它甚至不调用该方法。我可以到达方法 def 。用ctrl+lm所以方法名没有问题。

<h:body>
    <h:form id="createAppUserForm" prependId="false">
      ....
      <p:dialog id="newRoleDialogId"
                  header="Add New Role"
                  resizable="true"
                  draggable="true"
                  widgetVar="newRoleDetailsDialog"  
                  appendToBody="true"
                  >
            <p:panel id="newRoleDialogPanel">
                <p:panelGrid id="newRoleDialogPanelGrid" columns="2" style="width: 100%" styleClass="panelGridWithoutBorder">
                    <h:outputText value="Role Name :"/>
                    <p:inputText value="#{createAppUserController.selectedRole.name}"/>
                    <h:outputText value="Role Desc :"/>
                    <p:inputText value="#{createAppUserController.selectedRole.description}"/>
                </p:panelGrid>
                <center>
                    <p:commandButton value="Save"
                                     update="roleListDataTable newRoleDialogPanelGrid growlCreateAppUser"
                                     oncomplete="if (!args.validationFailed) newRoleDetailsDialog.hide()"                                     
                                     action="#{createAppUserController.saveNewRole()}"/>
                    <p:commandButton value="Cancel"                                         
                                     immediate="true"
                                     onclick="newRoleDetailsDialog.hide()" />
                </center>
            </p:panel>
        </p:dialog>
       </h:form>
    </h:body>

最佳答案

appendToBody/appendTo="@Body" 一起使用时的对话框必须有自己的形式。

<p:dialog>
    <h:form>
        ...
    </h:form>
</p:dialog>

因为,当对话框生成为 HTML 输出时,它是由 JavaScript 重新定位到 HTML <body> 的末尾。这导致它不再以任何形式存在。生成的 HTML DOM 树最终如下所示(使用 webbrowser 的开发工具查看):

<body>
    ...
    <form id="createAppUserForm">
        ...
    </form>
    ...
    <div id="newRoleDialogId" class="ui-dialog ...">
        ...
    </div>
</body>

appendToBody="true"在这里发挥作用。正文的末尾确保了通过 JavaScript 显示模式对话框的简单且最佳的跨浏览器兼容性。

顺便说一句,p:overlayPanel 也是如此。与 appendTo...

但在“移动”之前还要确保 p:dialog 存在,没有嵌套 h:form 。所以要防止

<h:form>
   ...

    <p:dialog>
        <h:form>
            ...
        </h:form>
    </p:dialog>

   ...
</h:form>

虽然最终结果是这样的

 <body>
    ...
    <form id="createAppUserForm">
        ...
    </form>
    ...
    <div id="newRoleDialogId" class="ui-dialog ...">
        <form>
           ...
        </form>
    </div>
</body>

它最初是无效的 html

另请参阅:

关于jsf - p :commandbutton action doesn't work inside p:dialog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18958729/

相关文章:

android - 当用户长按电源按钮时禁用关机对话框

java - 动态用户界面 :include

jsf - primefaces 订单列表未根据更改的订单进行更新

javascript - 将 jQuery 错误处理添加到 JSF 页面上列表、网格内的所有图像

primefaces - 加载 css 时出错,找不到 "theme"库的 "primefaces-bluesky-1.0.10".css 资源

primefaces - dtata 表中 rowStyleClass 的多个条件 PrimeFaces

c++ - MFC::使用结构传递数据

android - 自定义对话框大小以匹配 Theme.Holo.Light.Dialog

java - FacesMessage 不接受浏览器 clientID

jsf - 将 JSF 复合组件打包到 JAR 中