0

我在表格行的接缝页中使用了这样的中继器:

<a4j:repeat id="r1279186" value="#{PatientList.entities}" var="Patient" rowKeyVar="rowIndex" >
<tr>
<td>
    <a4j:commandButton action="#{PatientAction.inject(Patient)}" id="Button_1279184059161" reRender="Button_1287648925796" limitToList="true" />
</td>
<td  >
    <span >#{Patient.name_fam}</span>
</td>
<td  >
    <span >#{Patient.name_giv}</span>
</td>
    <td>
    <s:link id="Page_1234" action="#{PatientAction.inject(Patient)}"  view="/somewhere/patient_details.seam" rendered="true" target="_blank" propagation="join" title="VIS" limitToList="true" >
    <img src="images/24x24/info.png" title="VIS" alt="VIS}" style="height: 24px;width: 24px;"/>
    </s:link>
</td>
</tr>

PatientAction 是一个 bean,带有一个名为 inject 的方法,它在输入中接受一个 Patient 类 Object。PatientList.entities 是一个 List,中继器在一个名为 Patient 的 var 上循环,对象类的名称相同。

在将页面返回给客户端之前,seam 会为列表中的每个患者(行)呈现姓名和姓氏,并在第一列添加一个按钮,在最后一列添加一个链接。

使用按钮,当我单击按钮时执行操作,接收与我按下按钮的行相对应的注入患者的参数。[好的!]

当我使用链接(我用它打开一个新的浏览器页面,保持相同的对话)时,方法注入在我单击时被调用,但传递的参数为空!(我可以在我的注入方法的调试中看到,即将到来的患者为空)

4

1 回答 1

1

您不能将参数<s:link/>从重复元素传递给操作,如http://docs.jboss.org/seam/2.0.1.GA/reference/en/html/elenhancements.html#d0e22695中所述

引用:

使用内部迭代组件——组件喜欢<c:forEach/><ui:repeat/>迭代列表或数组,将列表中的每个项目暴露给嵌套组件。如果您使用 a<h:commandButton/>或选择一行,这非常有用<h:commandLink/>

但是,如果您想使用<s:link/><s:button/>必须将项目公开为 a DataModel,并使用 a <dataTable/>(或组件集中的等效项,如<rich:dataTable/>)。既不提交<s:link/>也不<s:button/>提交表单(因此会生成一个可收藏的链接),因此在调用操作方法时需要一个“魔术”参数来重新创建项目。只有在使用 a 支持的数据表时才能添加此魔术参数DataModel。”

因此,您必须使用<h:commandLink/>而不是<s:link/>,或者您可以创建一个可收藏的链接,如下所示:

<s:link view="/somewhere/patient.details.xhtml">
    <f:param name="patientId" value="#{Patient.id}" />
    ...
</s:link>

这会在 HTML: 中生成这样的链接/somewhere/patient_details.seam?patientId=5。由于链接中携带了患者 ID,因此该patient_details.xhtml页面具有检索数据以进行显示所需的信息。

为此,您需要放入一个参数定义,patient_details.page.xml以便在显示页面之前获取该值,例如:

<!-- Here we use an EntityHome component, assuming Patient is a JPA entity.
     When you set the ID of an EntityHome component, it automatically triggers
     an EntityManager.find() call to retrieve the Entity from DB. -->
<param name="patientId" value="#{patientHome.id}" />
于 2013-05-22T16:56:38.557 回答