Пустой объект передан действию на повторитель шва
У меня на странице шва для строк таблицы используется такой повторитель:
<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. PatientList.entities - это список, циклы повторителя для переменной с именем Patient, то же имя класса объекта.
Прежде чем вернуть страницу клиенту, seam отображает имя и фамилию для каждого пациента (строки) в списке и добавляет одну кнопку в первом столбце и одну ссылку в последнем.
Используя кнопку, действие выполняется, когда я нажимаю кнопку, получая в параметре inject Patient соответствующий строке, в которой я нажал кнопку. [ХОРОШО!]
Когда я использую ссылку (которую я использую для открытия новой страницы браузера, сохраняя тот же диалог), метод inject вызывается именно тогда, когда я нажимаю, но переданный параметр имеет значение null!! (Я вижу в отладке моего метода инъекции, Пациент приходит в ноль)
1 ответ
Вы не можете передать параметры <s:link/>
действие из повторяющегося элемента, как указано в http://docs.jboss.org/seam/2.0.1.GA/reference/en/html/elenhancements.html
Cite:
Использовать внутри итеративных компонентов - такие компоненты, как
<c:forEach/>
а также<ui:repeat/>
перебирайте список или массив, открывая каждый элемент списка для вложенных компонентов. Это прекрасно работает, если вы выбираете строку с помощью<h:commandButton/>
или же<h:commandLink/>
,Однако, если вы хотите использовать
<s:link/>
или же<s:button/>
Вы должны выставить предметы какDataModel
и использовать<dataTable/>
(или эквивалент из набора компонентов, например<rich:dataTable/>
). ни<s:link/>
или же<s:button/>
отправьте форму (и, следовательно, создайте закладку для ссылки), поэтому требуется "магический" параметр для воссоздания элемента при вызове метода действия. Этот магический параметр может быть добавлен только тогда, когда таблица данных поддерживается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
, Поскольку идентификатор пациента указан в ссылке, 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}" />