如果不在Dialog中呈现,则Primefaces DataTable Selection的属性为Null

时间:2017-03-15 05:41:55

标签: primefaces

我不确定这是我的限制还是编码错误。我有一个Primefaces DataTable,允许用户选择它(单选无线电),然后单击CommandButton来编辑对话框中的数据。

在我显示所选对象的HTML代码中,我省略了ID,Lat和Long属性,因为人类用户不应该触及这些属性。对话框正确显示所选属性,但是,当我尝试使用所选对象的ID进行更新时查找现有记录时,它会抛出无结果错误。当我检查所选对象的ID属性时,它的值为NULL。

我修改HTML代码并发现为了将任何属性复制到所选对象,必须在XHTML中显示属性。当我像Render = False一样包含属性时,该属性的值为NULL。有关隐藏人类用户不应使用禁用标记属性修改的属性的建议吗?

Class Property{
    Int ID;
    String Address;
    Long Lat;
    Long Long;
    String Desc;
}

public void modifyCurrentProject() {
    HashMap<String, Object> params = new HashMap();
    params.put("id", currentProject.getId());

    //fails to find Project by ID as currentProject.getID == null
    Project temp = (Project) dbu.findByNamedQuery("project.findID", params);

    //Omit statements to overwrite attached object's values before writing back to database 
    dbu.modifyEntity(); //dbu is another object to control database access
    currentProject = null;
}

<h:body>
    <p:growl id="projectMsg" showDetail="true"/>
    <h:form id="form">

        <p:dataTable id="projectTable" var="project" value="#{projectBacking.builder.projects}" selection="#{projectBacking.currentProject}" rowKey="#{project.id}">
            <f:facet name="header">My Project List
                <p:commandButton value="Add" type="button" onclick="PF('projectAdd').show()"/>
                <p:commandButton value="Edit" update=":editForm" oncomplete="PF('projectEdit').show()"/>
            </f:facet>

            <p:column selectionMode="single"/>   
            <p:column headerText="ID">
                <h:outputText value="#{project.id}"/>

            <p:column headerText="Description">
                <h:outputText value="#{project.property.description}"/>
            </p:column>

            <p:column headerText="Street">
                <h:outputText value="#{project.street}"/>
            </p:column>
            <p:column headerText="City">
                <h:outputText value="#{project.city}"/>
            </p:column>
            <p:column headerText="Province">
                <h:outputText value="#{project.state}"/>
            </p:column>

            <p:column headerText="Latitude">
                <h:outputText value="#{project.latitude}"/>
            </p:column>

            <p:column headerText="Longitude">
                <h:outputText value="#{project.longitude}"/>
            </p:column>

            <p:column headerText="Status">
                <h:outputText value="#{project.status}"/>
            </p:column>

        </p:dataTable>
    </h:form>

<!-- Omitted the Add Project Dialog box -->

    <p:dialog header="Edit Project" modal="true" height="400" width="80%" widgetVar="projectEdit">
        <h:form id="editForm">
            <p:panel id="editProject" header="Edit Project" toggleable="true" closable="false">
                <!--<h:inputText id="id" value="#{projectBacking.currentProject.id}"/>-->

                <h:inputText id="country" value="#{projectBacking.currentProject.country}"/>

                <h:inputText id="lat" rendered="true" value="#{projectBacking.currentProject.latitude}"/>

                <h:inputText id="long" rendered="true" value="#{projectBacking.currentProject.longitude}"/>

                <h:outputLabel for="desc" value="Description" />
                <h:inputText id="desc" value="#{projectBacking.currentProject.description}"/>

                <h:outputLabel for="street" value="Street" />
                <h:inputText id="street" value="#{projectBacking.currentProject.street}"/>
                <h:message for="street"/>

                <h:outputLabel for="city" value="City:" />
                <h:inputText id="city" required="false" value="#{projectBacking.currentProject.city}"/>
                <h:message for="city" />

                <h:outputLabel for="state" value="Province" />
                <h:inputText id="state" required="true" value="#{projectBacking.currentProject.state}"/>             

                <h:commandButton value="Save Project" type="submit" action="#{projectBacking.modifyCurrentProject()}">
                </h:commandButton>

            </p:panel>
        </h:form>
    </p:dialog>                  
</h:body>

1 个答案:

答案 0 :(得分:0)

在代码中放置了一些断点之后,我发现在保存Dialog中的更改后,它正在创建一个新的支持bean。如果设置为Render = false,Disabled = true或ReadOnly = true,则不会设置新的backing bean的对象值,并保留对象构造函数中指定的初始值。

基本上,原因是范围不正确。问题发生时我正在使用Request范围。但是,更改为会话范围解决了它。