сохранение простых лиц при редактировании данных не работает

моя xhtml-страница. функция добавления работает нормально. Итак, конвертеры работают, а ViewScope не работает, я попробовал SessionScope, и он работает нормально.

   <p:commandButton id="addOfficeButton"  icon="ui-icon-circle-plus"  oncomplete="AddOfficeDialog.show();"/>        

   <h:form  id="officeform"> 
    <p:growl id="growl" showDetail="true" sticky="true" />   
      <p:dataTable id="officeDT" var="office" value="#{offices}" rowKey="#{office.id}" style="width:40%"
                   selection="#{officeManagementController.selectedOffice}" selectionMode="single" editable="true">
        <p:ajax event="rowSelect" listener="#{officeManagementController.onRowSelect}" oncomplete="editDlg.show()"
                update=":tabView:officeform:growl,:tabView:officeform:editPanel"/> 
        <p:column sortBy="#{office.id}" headerText="Office ID">
            <h:outputText value="#{office.id}" />  
        </p:column>  

        <p:column headerText="System">     
               <h:outputText value="#{office.department.name}" />
        </p:column>  

        <p:column headerText="Section">     
               <h:outputText value="#{office.role.name}" rendered="#{office.role!=null}"/> 
        </p:column>  


        <p:column headerText="Options" style="width:50px"> 
           <p:rowEditor></p:rowEditor>    
        </p:column> 
      </p:dataTable>

      <p:dialog id="AddOfficeDialog" widgetVar="AddOfficeDialog" modal="true" header="Add/Edit Office" hideEffect="fade" showEffect="fade">
        <p:outputPanel layout="block" id="officeDetail">
         <p:panelGrid columns="2">

            <h:outputText value="Systemmm" />  
            <h:selectOneMenu value="#{officeManagementController.selectedSystem}" converter="#{applicationSystemConverter}">  
               <f:selectItem itemLabel="Select One" itemValue="#{null}" />  
               <f:selectItems value="#{departmentss}" var="appdepartment" itemLabel="#{appdepartment.name}" itemValue="#{appdepartment}"/> 
               <f:ajax event="change" listener="#{officeManagementController.onDepartmentChanged}" render="role"/> 
            </h:selectOneMenu> 

            <h:outputText value="Section" />  
            <h:selectOneMenu id="role" validate="true" value="#{officeManagementController.newOffice.role}" converter="#{departmentSectionConverter}">  
               <f:selectItem itemLabel="Select One" itemValue="#{null}" />  
               <f:selectItems value="#{officeManagementController.assignableRoles}" var="role" itemLabel="#{role.name}" itemValue="#{role}"/>  
            </h:selectOneMenu> 


         </p:panelGrid>
         <p:outputPanel layout="block" style="text-align:center;">
            <p:commandButton actionListener="#{officeManagementController.createOffice}" id="addOffice"  
                             value="Add Office" title="Add new office" oncomplete="AddOfficeDialog.hide();" update="growl,officeform"/>  
         </p:outputPanel>
        </p:outputPanel>
      </p:dialog>

       <p:dialog id="editDlg" widgetVar="editDlg" modal="true"  header="Add/Edit Office" hideEffect="fade" showEffect="fade">
       <p:outputPanel  id="editPanel">
         <p:panelGrid columns="2">
          <h:outputLabel value="Office ID: " />
            <h:outputText  value="#{officeManagementController.selectedOffice.id}"/>


            <h:outputText value="System" />  
            <h:selectOneMenu value="#{officeManagementController.selectedOffice.department}" converter="#{applicationSystemConverter}">  
               <f:selectItem itemLabel="Select One" itemValue="#{null}" />  
               <f:selectItems value="#{applicationSystems}" var="appdepartment" itemLabel="#{appdepartment.name}" itemValue="#{appdepartment}"/> 
               <f:ajax event="change" listener="#{officeManagementController.onApplicationSystemChanged}" render="sect"/> 
            </h:selectOneMenu> 

            <h:outputText value="Section" />  
            <h:selectOneMenu id="sect" validate="true" value="#{officeManagementController.selectedOffice.role}" converter="#{departmentSectionConverter}">  
               <f:selectItem itemLabel="Select One" itemValue="#{null}" />  
               <f:selectItems value="#{officeManagementController.assignableSysSections}" var="role" itemLabel="#{role.name}" itemValue="#{role}"/>  
            </h:selectOneMenu> 

           </p:panelGrid>
           <p:outputPanel layout="block" style="text-align:center;">
           <h:inputHidden binding="#{officeManagementController.selectedOfficeId}" />
          <p:commandButton actionListener="#{officeManagementController.updateOffice()}" 
                    value="Update Office" title="Update office" oncomplete="editDlg.hide();" update="@this,editPanel,growl,officeform"/>  
            </p:outputPanel>
         </p:outputPanel>
      </p:dialog>

   </h:form>

Поддерживающий компонент:

    public void updateOffice() {
        selectedOffice.setId(Long.valueOf((String)selectedOfficeId.getValue()));
        officeManagementService.update(selectedOffice);
        facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, CrudStatusMessage.SUCCESS.toString(), "Successfully updated Module: " + selectedOffice.getName()));
    }

Я получаю диалоговое окно, заполненное значениями строки, но проблема заключается в нажатии кнопки обновления, я получаю ошибку «Значение недействительно» в отделе, но главное, что значения selectedModule не установлены. Пожалуйста помоги. застрял с ним с недели.


person Jyothi Nalam    schedule 31.01.2013    source источник
comment
Не рекомендуется помещать диалоги внутрь формы. Попробуйте реорганизовать свой код и сделать форму для данных и поместить одну форму внутри каждого диалога.   -  person partlov    schedule 02.02.2013


Ответы (2)


Я думаю, вам действительно нужно actionListener (вместо action) на вашей кнопке. Вы должны прочитать о различиях в документах API, но суть в том, что actionListener будет выполнять обратную передачу AJAX, в то время как действие приведет к перенаправлению (что, в свою очередь, уничтожит ваше представление и заменит его новым).

person Tasos P.    schedule 31.01.2013
comment
Это была ошибка. Я использовал только actionListener. но это не работает - person Jyothi Nalam; 02.02.2013

Во-первых, вам не нужно () в:

<p:commandButton action="#{officeManagementController.updateOffice}" value="Update Office" title="Update office" oncomplete="editDlg.hide();" update="@this,editPanel,growl,officeform"/>  

Попробуйте использовать <f:ajax/> в своем <h:selectOneMenu> и проверьте, работает ли он.

person dShringi    schedule 01.02.2013