0

我有一个带有项目列表的数据表和一个用于选择要编辑的项目的复选框。勾选一个项目并单击编辑按钮会弹出一个组件,该组件具有字段以及更新和取消按钮。这就是发生的事情。

  1. 出现对话框
  2. 我清空所有字段并单击更新,由于所有字段都为空,因此出现必填消息,未保存数据
  3. 单击取消,对话框消失
  4. 再次单击并编辑同一项目
  5. 某些字段未显示。我检查了数据表和数据库,该项目的数据仍然存在。只是第二次没有在编辑对话框中显示。

我注意到未显示的字段仅是具有 NULL 属性的字段。NOT NULL 字段很好。我想知道这是否与会话有关。(对所有组件使用 Primefaces)

编辑对话框的代码

<p:dialog header="#{bundle.Edit}" modal="true" widgetVar="editDialog" resizable="false">
        <h:form id="edit-form">
          <p:messages id="edit-error" autoUpdate="true" closable="true"/>
          <h:outputLabel value="#{bundle.Name}" for="name" /><span class="required">*&lt;/span>
          <p:inputText id="name" value="#{controller.selected.name}" required="true" requiredMessage="#{bundle.Name}&nbsp;#{bundle.FieldIsRequired}" maxlength="45"/>
          <h:outputLabel value="#{bundle.Input}" for="input" /><span class="required">*&lt;/span>
          <h:selectOneRadio id="input" value="#{controller.selected.input}" required="true" requiredMessage="#{bundle.Input}&nbsp;#{bundle.FieldIsRequired}">
            <f:selectItem itemLabel="◯ " itemValue="0" />  
            <f:selectItem itemLabel="☓ " itemValue="1" />  
          </h:selectOneRadio>
          <h:outputLabel value="#{bundle.IsOption}" for="isOption" /><span class="required">*&lt;/span>
          <h:selectOneRadio id="isOption" value="#{controller.selected.isOption}" required="true" requiredMessage="#{bundle.IsOption}&nbsp;#{bundle.FieldIsRequired}">
            <f:selectItem itemLabel="◯ " itemValue="0" />  
            <f:selectItem itemLabel="☓ " itemValue="1" />   
          </h:selectOneRadio>
          <h:outputLabel value="#{bundle.Remark}" for="remark" />
          <p:inputTextarea id="remark" value="#{controller.selected.remark}"/>

          <p:commandButton action="#{controller.update()}" 
                           value="#{bundle.Save}" 
                           actionListener="#{controller.prepareList()}" 
                           oncomplete="handleEditDialog(xhr, status, args)" 
                           update=":form:datatable :edit-form:edit-error"
                           />
          <p:commandButton value="#{bundle.Cancel}" 
                           onclick="editDialog.hide(); reset();" 
                           type="button"/>
        </h:form>
      </p:dialog>



更新函数的代码

public String update() {
    RequestContext context = RequestContext.getCurrentInstance();
    try {
      current.setUpdateDate(new Date());
      Map<String, Object> param = JsfUtil.getExternal().getSessionMap();
      int createUser = (Integer) param.get("LOGIN_ID");
      Account account = accountFacade.find(createUser);
      current.setUpdateUser(account);
      getFacade().edit(current);
      search();
      prepareList();
      JsfUtil.addSuccessMessage(ResourceBundle.getBundle(JsfUtil.getSessionBundle()).getString("Updated"));
      updateOk = true;
      current = null;
      context.addCallbackParam("updated", true);
      return "";
    } catch (Exception e) {
      if (e.getCause().getCause().getMessage().contains("uk_")) {
        JsfUtil.addErrorMessage("edit-form:edit-error",JsfUtil.getResourceString("Duplicate"));
        context.addCallbackParam("updated", false);
      } else {
        JsfUtil.addErrorMessage(e, ResourceBundle.getBundle(JsfUtil.getSessionBundle()).getString("PersistenceErrorOccured"));
        context.addCallbackParam("updated", false);
      }
      return null;
    }
  }
4

2 回答 2

0

我的队友刚刚找到了解决这个问题的方法。NetBeans 生成的控制器上有一个名为prepareList() 的函数。

public String prepareList() {
    recreateModel();
    return "";
  }

private void recreateModel() {
    items = null;
  }

基本上我们在 update() 函数的 catch 块上添加了这个。每次更新失败后都会调用它并重新创建模型。存在该错误是因为该字段在更新失败后保持其没有值的状态。

于 2013-07-02T09:35:28.410 回答
0

根据您所描述的,我认为正在发生以下情况。当您看到表单并删除所有字段并点击保存时,没有验证器的组件实际上会覆盖您的 bean 以前的一些属性值。这就是为什么当您重新加载它以进行第二次编辑时,您会注意到所有附加了验证器(例如 required = true)的组件都出现了,但没有验证器的组件是空白的。实际上,您实际上是在进行部分更新。您实际需要做的是根据需要标记所有字段以避免该问题。

于 2013-07-01T18:55:49.677 回答