p:dialog 内对话框中的按钮未调用控制器方法
Button in dialog inside p:dialog is not calling controller method
我遇到了标题中描述的问题。
问题的小描述如下:
我有用于打开对话框的按钮。然后,在该对话框中,有一个按钮可以在第一个对话框的顶部打开另一个对话框。单击第二个按钮后,我希望调用控制器中的方法但没有任何反应。 h:outputText 中的值被正确读取,所以我猜这不是连接控制器->视图的问题。
我正在使用:
- Spring 网络 3.1.2.RELEASE
- JSF 2.2.10
- Primefaces 5.1
代码:
beans.xml
<bean id="testController" class="test.TestController" />
TestController.java
public class TestController implements Serializable
{
private static final long serialVersionUID = 7028608421091861830L;
private String test;
public TestController()
{
test = "abc";
}
public void testMethod()
{
test = "cba";
}
public String getTest()
{
return test;
}
}
test.xhtml
<h:panelGrid columns="1" cellpadding="5">
<p:commandButton value="Basic" type="button" onclick="PF('dlg1').show();" />
</h:panelGrid>
<p:dialog widgetVar="dlg1">
<h:outputText value="Resistance to PrimeFaces is futile!" />
<h:panelGrid columns="1" cellpadding="5">
<p:commandButton value="Basic" type="button" onclick="PF('dlg2').show();" />
</h:panelGrid>
<p:dialog widgetVar="dlg2">
<h:outputText value="#{testController.test}" />
<p:commandButton value="Call method" type="button" actionListener="#{testController.testMethod}" />
</p:dialog>
</p:dialog>
我尝试了什么:
- 将 appendToBody="true" 添加到每个 p:dialog
- 从 p:commandButton 更改为 p:button
- 从 actionListener 更改为 action
但没有任何帮助。
对于未调用给定方法的可能原因的任何帮助或建议,我将不胜感激。
有3个问题。
您正在嵌套 <p:dialog>
个组件。这没有意义。把他们分开。
一个<p:dialog>
必须有自己的<h:form>
,特别是当你明确使用appendToBody="true"
或appendTo="@(body)"
时,否则什么都不能提交,因为JavaScript 会将对话框从其在 HTML DOM 树中的位置重新定位到 body 的末尾,导致它不再位于表单中。
A <p:commandButton type="button">
用作 "click" 按钮,而不是提交按钮。从提交按钮中删除该属性。
总而言之,它应该是这样的:
<h:form>
<h:panelGrid columns="1" cellpadding="5">
<p:commandButton value="Basic" type="button" onclick="PF('dlg1').show();" />
</h:panelGrid>
</h:form>
<p:dialog widgetVar="dlg1">
<h:form>
<h:outputText value="Resistance to PrimeFaces is futile!" />
<h:panelGrid columns="1" cellpadding="5">
<p:commandButton value="Basic" type="button" onclick="PF('dlg2').show();" />
</h:panelGrid>
</h:form>
</p:dialog>
<p:dialog widgetVar="dlg2">
<h:form>
<h:outputText value="#{testController.test}" />
<p:commandButton value="Call method" actionListener="#{testController.testMethod}" />
</h:form>
</p:dialog>
好的。我想我找到了解决这个问题的方法。
看来问题是:
type="button"
我从每个按钮的属性列表中删除了它,现在即使没有 h:form 它也能正常工作。感谢您的帮助。
我遇到了标题中描述的问题。
问题的小描述如下: 我有用于打开对话框的按钮。然后,在该对话框中,有一个按钮可以在第一个对话框的顶部打开另一个对话框。单击第二个按钮后,我希望调用控制器中的方法但没有任何反应。 h:outputText 中的值被正确读取,所以我猜这不是连接控制器->视图的问题。
我正在使用:
- Spring 网络 3.1.2.RELEASE
- JSF 2.2.10
- Primefaces 5.1
代码:
beans.xml
<bean id="testController" class="test.TestController" />
TestController.java
public class TestController implements Serializable
{
private static final long serialVersionUID = 7028608421091861830L;
private String test;
public TestController()
{
test = "abc";
}
public void testMethod()
{
test = "cba";
}
public String getTest()
{
return test;
}
}
test.xhtml
<h:panelGrid columns="1" cellpadding="5">
<p:commandButton value="Basic" type="button" onclick="PF('dlg1').show();" />
</h:panelGrid>
<p:dialog widgetVar="dlg1">
<h:outputText value="Resistance to PrimeFaces is futile!" />
<h:panelGrid columns="1" cellpadding="5">
<p:commandButton value="Basic" type="button" onclick="PF('dlg2').show();" />
</h:panelGrid>
<p:dialog widgetVar="dlg2">
<h:outputText value="#{testController.test}" />
<p:commandButton value="Call method" type="button" actionListener="#{testController.testMethod}" />
</p:dialog>
</p:dialog>
我尝试了什么:
- 将 appendToBody="true" 添加到每个 p:dialog
- 从 p:commandButton 更改为 p:button
- 从 actionListener 更改为 action
但没有任何帮助。
对于未调用给定方法的可能原因的任何帮助或建议,我将不胜感激。
有3个问题。
您正在嵌套
<p:dialog>
个组件。这没有意义。把他们分开。一个
<p:dialog>
必须有自己的<h:form>
,特别是当你明确使用appendToBody="true"
或appendTo="@(body)"
时,否则什么都不能提交,因为JavaScript 会将对话框从其在 HTML DOM 树中的位置重新定位到 body 的末尾,导致它不再位于表单中。A
<p:commandButton type="button">
用作 "click" 按钮,而不是提交按钮。从提交按钮中删除该属性。
总而言之,它应该是这样的:
<h:form>
<h:panelGrid columns="1" cellpadding="5">
<p:commandButton value="Basic" type="button" onclick="PF('dlg1').show();" />
</h:panelGrid>
</h:form>
<p:dialog widgetVar="dlg1">
<h:form>
<h:outputText value="Resistance to PrimeFaces is futile!" />
<h:panelGrid columns="1" cellpadding="5">
<p:commandButton value="Basic" type="button" onclick="PF('dlg2').show();" />
</h:panelGrid>
</h:form>
</p:dialog>
<p:dialog widgetVar="dlg2">
<h:form>
<h:outputText value="#{testController.test}" />
<p:commandButton value="Call method" actionListener="#{testController.testMethod}" />
</h:form>
</p:dialog>
好的。我想我找到了解决这个问题的方法。
看来问题是:
type="button"
我从每个按钮的属性列表中删除了它,现在即使没有 h:form 它也能正常工作。感谢您的帮助。