h: commandLink не работает внутри dataTable - PullRequest
0 голосов
/ 11 марта 2012

В моем файле JSF у меня есть ниже в начале.

<h:form><h:commandLink value="Create New Staff Account" action="adminCreateStaffMember"/></h:form>.

С помощью этого при создании на Create New Staff Account меня перенаправляют на страницу, где у меня есть форма для создания новой учетной записи.

НО, когда я использую то же самое внутри dataTable, НЕ ДЕЙСТВУЕТ . Я все еще на той же странице: (

<h:dataTable var="c" value="#{newStaffMemberServiceBean.newStaffMemberDataBeanList}"
  styleClass="order-table"
  headerClass="order-table-header"
  rowClasses="order-table-odd-row,order-table-even-row"
  border="1" id="staffListDataTable" width="100%">

  <h:column>
    <f:facet name="header">
       Staff Member Name
    </f:facet>
    <h:form><h:commandLink value="Create New Staff Account" action="adminCreateStaffMember"/></h:form>
  </h:column>
</h:dataTable>

На самом деле я хотел напечатать информацию о соответствующем сотруднике, где я буду использовать f:setPropertyActionListener. Но, как указано выше, не работает, я не буду продолжать.

Пожалуйста, предложите мне, куда я иду неправильно .

Обновление 1

Мой newStaffMemberServiceBean находится в RequestScoped

@ManagedBean(name = "newStaffMemberServiceBean")
@RequestScoped
public class NewStaffMemberServiceBean {
    // some code
}

Обновление 2

HTML генерируется как показано ниже

За пределами dataTable

<div align="right">
<form id="j_idt35" name="j_idt35" method="post" action="/adminManageStaffMember" enctype="application/x-www-form-urlencoded">
<input type="hidden" name="j_idt35" value="j_idt35" />
<a href="#" onclick="mojarra.jsfcljs(document.getElementById('j_idt35'),{'j_idt35:j_idt36':'j_idt35:j_idt36'},'');return false">Create New Staff Account</a><input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="2664682277023387375:-3250423983171933030" autocomplete="off" />
</form>

Внутри dataTable

<form id="staffListDataTable:0:j_idt43" name="staffListDataTable:0:j_idt43" method="post" action="/adminManageStaffMember" enctype="application/x-www-form-urlencoded">
<input type="hidden" name="staffListDataTable:0:j_idt43" value="staffListDataTable:0:j_idt43" />
<a href="#" onclick="mojarra.jsfcljs(document.getElementById('staffListDataTable:0:j_idt43'),{'staffListDataTable:0:j_idt43:j_idt45':'staffListDataTable:0:j_idt43:j_idt45'},'');return false">Create New Staff Account</a><input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="2664682277023387375:-3250423983171933030" autocomplete="off" />
</form>

Ответы [ 3 ]

5 голосов
/ 11 марта 2012

Я бы предложил несколько модификаций для вашего исходного кода.Во-первых, не используйте h:form для каждого из ваших commandLink, вместо этого используйте одну форму для dataTable.Во-вторых, action будет выполняться только тогда, когда будет найден компонент, вызвавший действие.Если вы используете список с областью запроса для вашего datatable, то этот список не будет отображаться при восстановлении представления или может не совпадать с исходным, который использовался для создания представления.Возможно, вам придется изменить управляемый компонент из области запроса для просмотра области или выше.

В-третьих, в качестве рекомендации вы можете использовать h: outputLink или h: link вместо commandLink и предоставить f: param, чтобы упростить это, в этом случае вам также не нужна форма.

2 голосов
/ 11 марта 2012

Ваш стол обернут другой формой?

если это так, и вы получили форму внутри формы ...

удалить теги формы, которые обертывают <h:commandLink value="Create New Staff Account" action="adminCreateStaffMember"/>

как то так

<h:column>
    <f:facet name="header">
       Staff Member Name
    </f:facet>
    <h:commandLink value="Create New Staff Account" action="adminCreateStaffMember"/>
</h:column>
0 голосов
/ 11 марта 2012

Я полагаю, ваш метод действия commandLink установлен неправильно.У вас есть этот код:

<h:commandLink value="Create New Staff Account" action="adminCreateStaffMember"/>

У вас должно быть что-то вроде этого:

<h:commandLink value="Create New Staff Account"
    action="#{newStaffMemberServiceBean.adminCreateStaffMember"/>

Кроме того, как выложил @Daniel, у вас должна быть только 1 форма для упаковки dataTableи commandLink s внутри dataTable.

ОБНОВЛЕНИЕ:

Есть важные вещи, которые вы должны знать:

Если у вас есть список в качестве атрибута вашего управляемогоbean, этот список используется для отображения информации (т.е. с использованием dataTable), и вы хотите включить некоторую кнопку или ссылку в таблицу данных, ваш управляемый bean-компонент ДОЛЖЕН иметь ссылку на список в создателе.Этого можно достичь как минимум двумя способами:

  • Сохранить и загрузить список из сеанса (очень плохой дизайн, и довольно сложно поддерживать код).
  • Установить компонентв ViewScoped (в перспективе JSF2.x. Если вы работаете с JSF 1.2, вы можете попробовать тег a4j:keepAlive от RichFaces или t:saveState от MyFaces).

Сказав это, и так как выВы используете JSF 2, вы можете использовать ViewScope для вашего компонента.При этом бин не будет воссоздан после выполнения запроса в том же представлении, поэтому список будет сохранен автоматически внутри бина.Боб должен выглядеть так:

@ManagedBean(name = "newStaffMemberServiceBean")
@ViewScoped
public class NewStaffMemberServiceBean implements Serializable {
    private List<StaffMember> lstStaffMember;
    //getters and setters...
    public NewStaffMemberServiceBean() {
        //populate the list...
        lstStaffMember = new ArrayList<StaffMember>();
    }

    //managing the navigation using the id as a parameter
    //additional, this can (and MUST BE) improved.
    public String viewStaffMemberDetails() {
        //get the id parameter from the link
        int id = Integer.valueOf(FacesContext.getCurrentInstance()
            .getExternalContext().getRequestParameterMap().get("id"));
        //searching that id in our staff member list
        for(StaffMember sm : lstStaffMember) {
            if (sm.getId() == id) {
                //setting the staff member object in session
                FacesContext.getCurrentInstance().getExternalContext()
                    .getSessionMap().put("staffMember", sm);
                //returning the name of the page we want to navigate
                return "adminCreateStaffMember";
            }
        }
        return "";
    }
}

Теперь давайте проверим xhtml.Все довольно просто:

<h:form>
    Welcome
    <br />
    <h:dataTable
        value="#{newStaffMemberServiceBean.lstStaffMember}"
        var="staffMember">
        <h:column>
            <f:facet name="header">
                Name
            </f:facet>
            <h:outputText value="#{staffMember.name}" />
        </h:column>
        <h:column>
            <f:facet name="header">
                View Details
            </f:facet>
            <h:commandLink value="Show details"
                action="#{newStaffMemberServiceBean.viewStaffMemberDetails}">
                <f:param name="id" value="#{staffMember.id}" />
            </h:commandLink>
        </h:column>
    </h:dataTable>
</h:form>

И все!Вы можете без проблем перейти к adminCreateStaffMember.xhtml и использовать объект персонала в управляемом компоненте adminCreateStaffMember для отображения данных (подробностей).Я сам попробовал этот код (у меня новый компьютер, поэтому я должен проверить код перед публикацией, установить программное обеспечение и т. Д.).

...