0

我有一个用户列表页面,该页面将用户保存在 ap:dataTable中,并且在每一行中我都有一个显示弹出窗口的更新按钮。p:dialog页面和对话框在视图范围内进行管理(在 Spring 中实现)。

当我editUserButton在主页中按 时,弹出窗口会显示所有数据,然后我在emailusername字段中输入无效字符串。将出现验证消息,但选项列表未填充任何值。

可能是什么问题呢?

这是主页(用户列表)代码段:

<ui:composition>
<f:view id="bodyView">
    <div id="content_body">
        <ui:include src="editUserDialog.xhtml"/>
        <h:form id="usersListForm">
        <table width="85%" align="center">
            <tr>
                <td>
                    <p:dataTable id="usersList" var="user" 
                             value="#{usersController.usersList}"
                             selectionMode="single"
                             rowKey="#{user.userId}">
                        <p:columnGroup type="header">
                            <p:row>
                                ...
                                <p:column rowspan="2" headerText="Users"/>
                                ...
                            </p:row>
                        </p:columnGroup>
                            ...
                        <p:column id="users" >
                            <p:commandLink id="editUserButton" oncomplete="addEditUserConfirmation.show()" actionListener="#{addEditUserController.selectionListener}"
                                    update=":addEditCustomerDialogForm:dialogContent">
                                    <f:attribute value="#{user}" name="selectedUser" />
                            </p:commandLink>
                        </p:column>
                    </p:dataTable>
                </td>
            </tr>
        </table>
        <br/>
        </h:form>
    </div>
</f:view>

这是 p: 对话框代码:

<ui:composition>
<h:form id="addEditUserDialogForm">
        <p:dialog id="addEditUserDialog" severity="alert" widgetVar="addEditUserConfirmation" draggable="true" modal="true"
              resizable="false" >
        <p:outputPanel id="dialogContent">
        <div>
            <table cellpadding="5">
                <tr>
                    <td>
                        <p:inputText value="#{addEditUserController.addEditCustomerBean.userName}"
                                maxlength="250" size="50" label="user name" id="userName">
                            <f:validator validatorId="UsernameValidator"/>
                        </p:inputText>
                        <p:message for="userName"/>
                    </td>
                </tr>
                <tr>
                    <td>
                        <p:inputText value="#{addEditUserController.addEditCustomerBean.email}"
                                maxlength="50" size="50" label="E-mail" id="email">
                            <f:validator validatorId="EmailValidator"/>
                        </p:inputText>
                        <p:message for="email"/>
                    </td>
                </tr>
            </table>
            <table cellpadding="5">
                <tr>
                    <td>
                        <p:pickList id="customersList" iconOnly="true"
                                    value="#{addEditUserController.customersList}" var="customer"
                                    itemValue="#{customer.value}" itemLabel="#{customer.label}"/>
                    </td>
                </tr>
            </table>
        </div>
        <div align="right">
            <p:commandButton value="#{isNewUser ? 'add' : 'update'}" id="updateUserButton"
                                         actionListener="#{addEditUserController.persistUser}"
                                         update="dialogContent"
                                         styleClass="fiftyone-default-button"
                                oncomplete="handleRequest(xhr, status, args)"/>
        </div>
        </p:outputPanel>
</p:dialog>
</h:form>
<script type="text/javascript">
    function handleRequest(xhr, status, args) {
        if(!(args.validationFailed &amp;&amp; args.validationFailed == true)) {
            addEditUserConfirmation.hide();
        }
    }
</script>

这是支持 bean 代码:

import org.primefaces.model.DualListModel; 
import javax.annotation.PostConstruct;
import javax.faces.event.ActionEvent;
import java.util.List;

public class AddEditUserController {
   private AddEditCustomerBean addEditCustomerBean;
   private DualListModel<LabelValueBean> customersList;

   // ... constructor getters and setters

   public void selectionListener(ActionEvent event) throws Exception {
        selectedUser = event.getComponent().getAttributes().get("selectedUser");
        // some code
        AddEditCustomerBean = new AddEditCustomerBean();
        // some code
        customersList = getSomeCustomersDualListModel()
    }

    public void persistUser() throws Exception {
       // save user to DB
    }
}
4

2 回答 2

0

这是一个老问题,但我最近也遇到了这个问题,现在很无奈。让我们看看 p:pickList:

                <td>
                    <p:pickList id="customersList" iconOnly="true"
                                value="#{addEditUserController.customersList}" var="customer"
                                itemValue="#{customer.value}" itemLabel="#{customer.label}"/>
                </td>

我们知道 [var="customer"] 是一个迭代器,但是当发生验证错误时,这个 var 被分配给 String 类型,这很奇怪。当您关闭此弹出窗口然后再次重新填充它时,您将收到一条错误消息,如下所示:字符串类型上没有属性标签(值)...客户变量现在是字符串,因此它没有值也没有标签财产。

现在,我使用一个棘手的方法,它不会总是奏效,这取决于你的代码:假设值和标签是唯一的,设置customersList类型为List String,customersList绑定标签,找到标签的值在后端提交时;为什么这种方式可以避免重新填充异常,那是因为迭代器始终是String类型,无论是否发生验证错误。

希望这可以帮助需要。

于 2013-10-10T03:36:05.673 回答
0

我要做的第一件事是确保selectionListener正在调用该方法(要么在其上放置一个断点,要么打印一些东西并稍后在控制台中检查)。

如果是,则必须检查变量customersList是否正确更新,如果不是,则可能是 bean 作用域存在问题。

在您的示例代码中,不清楚您如何设置支持 bean 的范围,所以我假设您是在 Spring 的 XML 配置文件中进行的。

通过检查视图映射的内容,确保您确实在视图范围内拥有支持 bean FacesContext.getCurrentInstance().getViewRoot().getViewMap():。

希望能帮助到你!

于 2012-06-03T21:15:18.677 回答