【问题标题】:No Update of Fields after Validation error验证错误后不更新字段
【发布时间】:2012-07-31 09:38:21
【问题描述】:

我有一个 primefaces 对话框,我可以在其中创建或更新员工。 它将由此打开

    </p:dialog><p:dialog id="employeeEditDialog" header="#{msg.employeeEdit}"
        widgetVar="dlgEmployeeEdit" resizable="false">

        <p:ajax  event="close" listener="#{employeeView.cancel}"
              update=":showEmployees:liste" />

        <ui:include src="/content/Employee/ShowEmployeeContent.xhtml" />
    </p:dialog>

这里是对话框页面

<h:form id="editContent">
<p:growl id="growl" showDetail="true" sticky="false" life="5000" />
<p:focus id="focusEdit" for="emSalutation" />
<h:panelGrid columns="2" id="contentGrid">
    <h:panelGrid columns="2" id="allgemein">                                                            <h:outputText value="#{msg.id}" />
        <h:outputText value="#{employeeView.newEmployee.id}" />

        <h:outputText value="#{msg.salutation}" />
        <p:selectOneMenu value="#{employeeView.newEmployee.salutation}"
            id="emSalutation">
            <f:selectItem itemLabel="" itemValue="" />
            <f:selectItems value="#{employeeView.salutations}" var="salutations"
                itemLabel="#{salutations.description}" itemValue="#{salutations}" />
        </p:selectOneMenu>

        <h:outputText value="#{msg.title}" />
        <p:inputText value="#{employeeView.newEmployee.title}" id="emTitle" />

        <h:outputText value="#{msg.name}" />
        <p:inputText value="#{employeeView.newEmployee.name}" id="emName"
            validatorMessage="#{msg.valName}" />

        <h:outputText value="#{msg.prename}" />
        <p:inputText value="#{employeeView.newEmployee.prename}"
            id="emPrename" />

        <h:outputText value="#{msg.loginname}" />
        <p:inputText value="#{employeeView.newEmployee.loginname}"
            validatorMessage="#{msg.valLogin}" />

        <h:outputText value="#{msg.department}" />
        <h:panelGrid columns="2" id="departmentGrid">
            <p:selectOneMenu value="#{employeeView.selectedDepartment.id}"
                id="emDepartment">
                <f:selectItem itemLabel="" itemValue="" />
                <f:selectItems value="#{employeeView.departmentList}"
                    var="department" itemLabel="#{department.description}"
                    itemValue="#{department.id}" />
            </p:selectOneMenu>
            <p:commandButton icon="ui-icon-disk" immediate="true"
                oncomplete="dlgDepartmentAdd.show()"
                update="departmentGrid, :departmentAddDialog">
            </p:commandButton>
        </h:panelGrid>

        <h:outputText value="#{msg.position}" />
        <h:panelGrid columns="2" id="positionGrid">
            <p:selectOneMenu value="#{employeeView.selectedPosition.id}"
                id="emPosition">
                <f:selectItem itemLabel="" itemValue="" />
                <f:selectItems value="#{employeeView.positionList}" var="position"
                    itemLabel="#{position.description}" itemValue="#{position.id}" />
            </p:selectOneMenu>
            <p:commandButton icon="ui-icon-disk" immediate="true" id="buttonPos"
                oncomplete="dlgPositionAdd.show()"
                update="positionGrid, :positionAddDialog">
            </p:commandButton>
        </h:panelGrid>

        <h:outputText value="#{msg.phone}" />
        <p:inputText value="#{employeeView.newEmployee.phone}" id="emPhone" />

        <h:outputText value="#{msg.fax}" />
        <p:inputText value="#{employeeView.newEmployee.fax}" id="emFax" />

        <h:outputText value="#{msg.email}" />
        <p:inputText value="#{employeeView.newEmployee.email}" id="emEmail"
            validator="myEmailValidator" validatorMessage="#{msg.valEmail}" />

        <h:outputText value="#{msg.employeedSince}" />
        <p:calendar value="#{employeeView.newEmployee.employeedSince}"
            id="emEmployeedSince" pattern="dd.MM.yyy" showOn="button" />

        <h:outputText value="#{msg.employeedEnd}" />
        <p:calendar value="#{employeeView.newEmployee.employeedEnd}"
            id="emEmployeedEnd" pattern="dd.MM.yyy" showOn="button" />

        <h:outputText value="#{msg.active}" />
        <p:selectBooleanCheckbox  value="#{employeeView.newEmployee.active}"
            id="emActive" /> 
    </h:panelGrid>

</h:panelGrid>

<h:panelGrid columns="3" class="buttonContent" id="button">
    <p:commandButton value="#{msg.save}" id="saveButton" update="growl"
        oncomplete="if ((!args.validationFailed)) dlgEmployeeEdit.hide()"
        actionListener="#{employeeView.saveOrUpdateEmployee}" />
    <p:commandButton value="#{msg.cancel}" immediate="true"
        oncomplete="dlgEmployeeEdit.hide()"/>
    <p:commandButton value="#{msg.delete}" immediate="true"
        oncomplete="dlgEmployeeDelete.show()"
        disabled="#{(employeeView.newEmployee.id == null) ? true : false}" />
</h:panelGrid>

<p:defaultCommand target="saveButton" /></h:form></html>

现在这是页面中使用的两种方法:

/**
 * Methode zum Speichern und Updaten eines Mitarbeiters
 */
public void saveOrUpdateEmployee() {
    FacesContext context = FacesContext.getCurrentInstance();
    try {
        logger.debug("save aufgerufen " + this.newEmployee);
        if (this.selectedDepartment.getId() == null) {
            this.newEmployee.setDepartment(null);
        }
        else {
            this.newEmployee.setDepartment(this.departmentHandler.getDepartmentById(this.selectedDepartment.getId()));
        }
        if (this.selectedPosition.getId() == null) {
            this.newEmployee.setPosition(null);
        }
        else {
            this.newEmployee.setPosition(this.positionHandler.getPositionById(this.selectedPosition.getId()));
        }
        this.employeeController.saveOrUpdate(this.newEmployee);
        logger.info("Mitarbeiter erfolgreich gespeichert");
        context.addMessage(null, new FacesMessage("Successful", "Mitarbeiter gespeichert "));
    }
    catch (Exception e) {
        logger.error("Fehler beim Speichern des Mitarbeiters", e);
        context.addMessage(null, new FacesMessage("Fehler beim Speichern des Mitarbeiters", e.getMessage()));
    }
    this.loadPersons();
}

/**
 * Methode zum Abbrechen bei der Neuanlage/Änderung eines Mitarbeiters
 * Felder leeren
 */
public void cancel() {
    logger.debug("cancel()");
    this.newEmployee = new Employee();
    this.selected = new Employee();
    this.selectedDepartment = new Department();
    this.selectedPosition = new Position();
}

如果现在验证失败,对话框将不会隐藏。这是可以的,也是需要的。它根据需要通过 FacesMassages 显示我创建的消息。如果我随后使用“取消”按钮自行关闭对话框,对话框将按预期关闭。如您所见,在 cancel() 方法中,对象 Employee 将被设置为 Employee (this.newEmployee = new Employee()) 的一个新实例。但是当我在验证失败后打开对话框时,对象“newEmployee”只包含旧值......为什么我的方法cancel()不起作用?我不明白。

【问题讨论】:

  • 嘿 BalusC!我必须更正我的答案!它有效!我刚刚忘记将 ResetInputAjaxActionListener 注册为阶段监听器!感谢您的帮助和快速回答!

标签: ajax validation user-interface jsf-2 primefaces


【解决方案1】:

此问题与JSF issue 1060有关,在本问答中有详细阐述:How can I populate a text field using PrimeFaces AJAX after validation errors occur?

根据当前的 JSF 规范,这种行为(不幸的是)是正确的,可以通过以下方式解决:在调用操作阶段,您需要收集包含在 ajax 渲染中的 UIInput 组件,但不是在 ajax 中执行,然后在它们上调用resetValue() 方法。这可以在OmniFaces ResetInputAjaxActionListener 的帮助下以通用且可重复使用的方式完成。

【讨论】:

  • 您的解决方案对我有帮助,但它并不能完全奏效。按如下按钮打开对话框: 使用 DataTable 中的 Dblclick,我可以加载和编辑现有员工: 通过 dblclick 后 valFailed 字段不会清除
猜你喜欢
  • 1970-01-01
  • 2019-08-29
  • 2016-02-09
  • 2014-05-08
  • 2020-07-20
  • 2017-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多