Jsf 打开对话框将验证主窗体的有效性,而我不使用它';我不想要

Jsf 打开对话框将验证主窗体的有效性,而我不使用它';我不想要,jsf,primefaces,Jsf,Primefaces,如果我点击add按钮(例如“CreateCategory1”Id)添加一个新的产品类别,我会得到“Name field is required”验证消息。这应该会打开一个对话框,在那里我可以输入新的类别名称,没有其他。此时,我不想验证主表单,因为我只想添加一个新的产品类别,稍后将使用它。为什么对话框会打开以验证表单?我怎样才能避免这种情况 多谢各位 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE html PUBLIC

如果我点击add按钮(例如“CreateCategory1”Id)添加一个新的产品类别,我会得到“Name field is required”验证消息。这应该会打开一个对话框,在那里我可以输入新的类别名称,没有其他。此时,我不想验证主表单,因为我只想添加一个新的产品类别,稍后将使用它。为什么对话框会打开以验证表单?我怎样才能避免这种情况

多谢各位

    <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:f="http://xmlns.jcp.org/jsf/core"
      xmlns:p="http://primefaces.org/ui">

    <ui:composition >
        <h:outputScript library="js" name="warning.js"/>  
        <h:form id="ProductEditForm" target="_blank">
            <div class="ui-fluid">
                <p:panelGrid columns="4" columnClasses="ui-grid-col-6,ui-grid-col-2,ui-grid-col-2,ui-grid-col-2" layout="grid" styleClass="ui-panelgrid-blank" >
                    <p:outputPanel style="height: 70px" >
                        <p:breadCrumb model="#{breadCrumb.productMenuModel}" style="background: inherit; border: none" />           
                        <h2>#{productController.selected.name}</h2>
                    </p:outputPanel>
                    <p:commandButton style="height: 30px; background: #{userController.headerColor}"  icon="ui-icon-check" oncomplete="javascript:saved=true" action="#{productController.update}" actionListener="#{breadCrumb.navigateProduct()}" update=":center,:growl" value="#{bundle.Save}" />
                    <p:commandButton style="height: 30px" icon="ui-icon-close" oncomplete="javascript:saved=true"  action="#{productController.refreshSelected()}" actionListener="#{breadCrumb.navigateProduct()}" update=":center,:growl" value="#{bundle.Cancel}"/>
                    <p:commandButton style="height: 30px" icon="ui-icon-document" update="@([id$=ProductHistoryDateForm])" oncomplete="PF('ProuctHistoryDateDialog').show()" value="Print history" disabled="#{empty productController.selected}" />
                </p:panelGrid>
                <p:panelGrid columns="2" columnClasses="ui-grid-col-6,ui-grid-col-6" layout="grid" >
                    <p:panel>
                        <h3>Main info</h3>   
                        <p:panelGrid columns="2" columnClasses="ui-grid-col-3,ui-grid-col-9" layout="grid" styleClass="ui-panelgrid-blank">
                            <p:outputLabel value="#{bundle.EditProductLabel_name}" for="name" />
                            <p:inputText id="name" value="#{productController.selected.name}" title="#{bundle.EditProductTitle_name}" required="true" requiredMessage="#{bundle.EditProductRequiredMessage_name}"/>
                            <p:outputLabel value="#{bundle.EditProductLabel_originalName}"/>
                            <p:inputText id="originalName" value="#{productController.selected.originalName}"/>
                            <h:outputText value="#{bundle.ViewInventoryItemLabel_serialized}"/>
                            <p:selectBooleanCheckbox disabled="false" value="#{productController.selected.serialized}" />
                            <p:outputLabel value="#{bundle.EditProductLabel_ean}" for="ean" />
                            <p:inputText id="ean" value="#{productController.selected.ean}" title="#{bundle.EditProductTitle_ean}" />
                            <p:outputLabel value="#{bundle.EditProductLabel_itemNr}" for="itemNr" />
                            <p:inputText id="itemNr" value="#{productController.selected.itemNr}" title="#{bundle.EditProductTitle_itemNr}" />
                            ...
                        </p:panelGrid>
                        <h3>Sales</h3>
                        <p:panelGrid columns="2" columnClasses="ui-grid-col-3,ui-grid-col-9" layout="grid" styleClass="ui-panelgrid-blank">
                            <p:outputLabel for="defaultSupplier" value="#{bundle.EditProduct_defaultSupplier}"/>
                            <p:selectOneMenu id="defaultSupplier" filter="true" value="#{productController.selected.defSupplierPartner}" title="#{bundle.EditProduct_defaultSupplier}" effect="fold" editable="false">
                                <f:selectItem itemLabel="#{bundle.SelectOneMessage}" itemValue="#{null}" noSelectionOption="true" />
                                <f:selectItems value="#{partnerController.items}"
                                               var="partnerDataIdItem"
                                               itemValue="#{partnerDataIdItem}"
                                               itemLabel="#{partnerDataIdItem.name}"/>
                            </p:selectOneMenu>
                            <p:outputLabel value="#{bundle.EditProductLabel_purchaseDeliveryTime}" for="purchaseDeliveryTime" />
                            <p:inputText id="purchaseDeliveryTime" value="#{productController.selected.purchaseDeliveryTime}" title="#{bundle.EditProductTitle_purchaseDeliveryTime}" />
                            <p:outputLabel value="#{bundle.EditProductLabel_lastPurchase}" />
                            <p:inputText id="lastPurchase" value="#{productController.selected.lastPurchasePrice}" />
                            ...
                        </p:panelGrid>
                    </p:panel>
                    <p:panel id ="productGroups">
                        <h3>Product categories</h3>
                        <p:panelGrid columns="3" columnClasses="ui-grid-col-1,ui-grid-col-1,ui-grid-col-11" layout="grid" styleClass="ui-panelgrid-blank">

                            <p:commandButton id="CreateCategory1" actionListener="#{productCategoryController.prepareCreate(1)}" update="productGroups, ProductCategoryCreateForm" icon="ui-icon-plus" oncomplete="PF('ProductCategoryCreateDialog').show()"/>                            
                            <p:commandButton id="DeleteCategory1" disabled="#{productController.selected.productCategoryId1 == null}" update="category1" actionListener="#{productCategoryController.deleteProductCategory(productController.selected.productCategoryId1)}" icon="ui-icon-minus" />   

                            <p:selectOneMenu id="category1" value="#{productController.selected.productCategoryId1}" label="#{productController.selected.productCategoryId1.name}" effect="fold">
                                <f:selectItem itemLabel="#{bundle.SelectOneMessage}" itemValue="#{null}" noSelectionOption="true" />
                                <f:selectItems value="#{productCategoryController.getItemsByLevel(1)}" 
                                               var="item" 
                                               itemLabel="#{item.name}"/>
                                <p:ajax event="change" update="productGroups" listener="#{productController.changeCategory(1)}"/>
                            </p:selectOneMenu>
                            <p:commandButton id="CreateCategory2" rendered="#{productController.selected.productCategoryId1 != null}" actionListener="#{productCategoryController.prepareCreate(2)}" update="productGroups, ProductCategoryCreateForm" icon="ui-icon-plus" oncomplete="PF('ProductCategoryCreateDialog').show()"/>
                            <p:commandButton id="DeleteCategory2" disabled="#{productController.selected.productCategoryId2 == null}" update="category2" actionListener="#{productCategoryController.deleteProductCategory(productController.selected.productCategoryId2)}" icon="ui-icon-minus" />   

                            <p:selectOneMenu id="category2" rendered="#{productController.selected.productCategoryId1 != null}" label="#{productController.selected.productCategoryId2.name}" value="#{productController.selected.productCategoryId2}" effect="fold">
                                <f:selectItem itemLabel="#{bundle.SelectOneMessage}" itemValue="#{null}" noSelectionOption="true" />
                                <f:selectItems value="#{productCategoryController.getItemsByLevel(2)}" 
                                               var="item"                                                   
                                               itemLabel="#{item.name}"/>
                                <p:ajax event="change" update="productGroups" listener="#{productController.changeCategory(2)}"/>
                            </p:selectOneMenu> 
                            <p:commandButton id="CreateCategory3" rendered="#{productController.selected.productCategoryId2 != null}" actionListener="#{productCategoryController.prepareCreate(3)}" update="productGroups, ProductCategoryCreateForm" icon="ui-icon-plus" oncomplete="PF('ProductCategoryCreateDialog').show()"/>
                            <p:commandButton id="DeleteCategory3" disabled="#{productController.selected.productCategoryId3 == null}" update="category3" actionListener="#{productCategoryController.deleteProductCategory(productController.selected.productCategoryId3)}" icon="ui-icon-minus" />   

                            <p:selectOneMenu id="category3" label="#{productController.selected.productCategoryId3.name}" rendered="#{productController.selected.productCategoryId2 != null}" value="#{productController.selected.productCategoryId3}" effect="fold">
                                <f:selectItem itemLabel="#{bundle.SelectOneMessage}" itemValue="#{null}" noSelectionOption="true" />
                                <f:selectItems value="#{productCategoryController.getItemsByLevel(3)}" 
                                               var="item"                                                   
                                               itemLabel="#{item.name}"/>
                                <p:ajax event="change" update="productGroups" listener="#{productController.changeCategory(3)}"/>
                            </p:selectOneMenu> 
                            <p:commandButton id="CreateCategory4" rendered="#{productController.selected.productCategoryId3 != null}" actionListener="#{productCategoryController.prepareCreate(4)}" update="productGroups, ProductCategoryCreateForm" icon="ui-icon-plus" oncomplete="PF('ProductCategoryCreateDialog').show()"/> 
                            <p:commandButton id="DeleteCategory4" disabled="#{productController.selected.productCategoryId4 == null}" update="category4" actionListener="#{productCategoryController.deleteProductCategory(productController.selected.productCategoryId4)}" icon="ui-icon-minus" />   

                            <p:selectOneMenu id="category4" label="#{productController.selected.productCategoryId4.name}" rendered="#{productController.selected.productCategoryId3 != null}" value="#{productController.selected.productCategoryId4}" effect="fold">
                                <f:selectItem itemLabel="#{bundle.SelectOneMessage}" itemValue="#{null}" noSelectionOption="true" />
                                <f:selectItems value="#{productCategoryController.getItemsByLevel(4)}" 
                                               var="item"                                                   
                                               itemLabel="#{item.name}"/>
                                <p:ajax event="change" update="productGroups" listener="#{productController.changeCategory(4)}"/>
                            </p:selectOneMenu> 
                        </p:panelGrid>
                    </p:panel>
                </p:panelGrid>
            </div> 
        </h:form>
    </ui:composition>
</html>

#{productController.selected.name}
主要信息
...
销售额
...
产品类别

这不是一个直接的答案,而是对这个问题的全部错误以及如何通过做出[mcve]来缩小真正的问题进行了广泛的评论。。。最后有一个简单的答案

  • 去掉构图
  • 删除
    h:outputScript
  • 删除所有样式
  • 卸下结构
    div
    s
    panelGrid
  • 从标签上删除“bundle”并使其静止
  • 删除大多数输入(保留一个输入,以便它仍然显示问题)
  • 删除大多数打开对话框的按钮,并保留一个(您提到的那个),以便它仍然显示问题
那会是什么样子

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:f="http://xmlns.jcp.org/jsf/core"
      xmlns:p="http://primefaces.org/ui">

    <h:form id="ProductEditForm" target="_blank">

        <p:commandButton id="CreateCategory1" actionListener="#{productCategoryController.prepareCreate(1)}" update="productGroups, ProductCategoryCreateForm" oncomplete="PF('ProductCategoryCreateDialog').show()"/>                            
           
        <p:selectOneMenu id="category1" value="#{productController.selected.productCategoryId1}" label="Category 1">
            <f:selectItem itemLabel="Select one" itemValue="#{null}" noSelectionOption="true" />
            <f:selectItems value="#{productCategoryController.getItemsByLevel(1)}" var="item" itemLabel="#{item.name}"/>
            <p:ajax event="change" update="productGroups" listener="#{productController.changeCategory(1)}"/>
        </p:selectOneMenu>
                           
        <p:selectOneMenu id="category2" rendered="#{productController.selected.productCategoryId1 != null}" label="Category 2" value="#{productController.selected.productCategoryId2}" effect="fold">
            <f:selectItem itemLabel="Select one" itemValue="#{null}" noSelectionOption="true" />
            <f:selectItems value="#{productCategoryController.getItemsByLevel(2)}" var="item" itemLabel="#{item.name}"/>
            <p:ajax event="change" update="productGroups" listener="#{productController.changeCategory(2)}"/>
    </p:selectOneMenu> 

    </h:form>

</html>
如果问题仍然出现,则使用
f:ajax
h:inputText
,甚至使用
f:ajax
h:commandButton
(将oncomplete更改为onevent),使其不太依赖于素面(并且仍然会导致错误)

但现在我们来谈谈。。。打开对话框的oncomplete。。。它实际上与打开对话框有关吗?如果您在commandButton中使用一个简单的
oncomplete=“alert('Hi there');
”会怎么样?它失败了吗?100%确定,所以你的标题

打开对话框验证我不想要的主窗体 你的问题呢

“为什么打开对话框验证表单?”

都错了。。。如果完全移除oncomplete,会怎么样?还是失败?对嗯。。。所以它只是和按下一个按钮有关。按钮是做什么的?它提交了一份表格。。。正在验证它。。。所以你的问题就变得非常有效了

“如何防止commandButton提交和验证我的整个表单?”

你也可以先把oncomplete去掉,问自己一个与标题相关的问题:

“它与打开对话框有关吗?如果我不打开对话框怎么办?在哪里做?在oncomplete中,如果我删除它怎么办”)

如果您在搜索引擎中发布了您的新问题,并在其中添加了“PrimeFacesJSF site:stackoverflow.com”,阅读之后您会发现:

这与评论中所说的一模一样。可能还不够(您可能需要将一些其他id添加到您确实希望使用特定按钮提交的字段的
过程
属性中,但是您将有一个更详细的问题

当然,您也可以制作多个表单,提交较小的部分


在所有不想提交表单的按钮上使用process=“@this”如何制作表单?@JaqenH'ghar:我认为OP需要提交一些东西……因此可能需要向
流程添加其他输入
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:f="http://xmlns.jcp.org/jsf/core"
      xmlns:p="http://primefaces.org/ui">

    <h:form id="ProductEditForm" target="_blank">

        <p:commandButton id="CreateCategory1" actionListener="#{productCategoryController.prepareCreate(1)}" update="productGroups, ProductCategoryCreateForm" oncomplete="PF('ProductCategoryCreateDialog').show()"/>                            
           
        <p:inputText id="category1" value="#{productController.selected.productCategoryId1}" label="Category 1">
            <p:ajax event="change" update="productGroups" listener="#{productController.changeCategory(1)}"/>
        </p:inputText>
                           
        <p:inputText id="category2" rendered="#{productController.selected.productCategoryId1 != null}" label="Category 2" value="#{productController.selected.productCategoryId2}">

            <p:ajax event="change" update="productGroups" listener="#{productController.changeCategory(2)}"/>
    </p:inputText> 

    </h:form>

</html>