将操作方法​​名称作为参数传递给facelets组件

Man*_*niP 17 jsf facelets myfaces

我正在调用模板,并传递如下参数:

<ui:include src="WEB-INF/Subviews/ProductEdit.xhtml">
    <ui:param name="items" value="#{produtList}"></ui:param>
    <ui:param name="itemToEdit" value="#{productToEdit}"></ui:param>
</ui:include>
Run Code Online (Sandbox Code Playgroud)

在ProductEdit.xhtml中,我有类似的东西

<ui:repeat value="#{items}" var="item">
  <tr>
    ...
    ...
    <td style="text-align: center">
      <h:commandLink style="cssGenericColumn" action="#{productEditAction}">
         <f:setPropertyActionListener target="#{itemToEdit}" value="#{item}"/>
      </h:commandLink>    
    </td>
  <tr>
</ui:repeat>
Run Code Online (Sandbox Code Playgroud)

哪个工作正常.

我现在想在ProductEdit.xhtml中参数化#{productEditAction},所以我做了以下

<ui:include src="WEB-INF/Subviews/ProductEdit.xhtml">
    <ui:param name="items" value="#{produtList}"></ui:param>
    <ui:param name="itemToEdit" value="#{productToEdit}"></ui:param>
    <ui:param name="itemEditAction" value="#{productEditAction}"></ui:param>
</ui:include>
Run Code Online (Sandbox Code Playgroud)

在第一页然后在ProductEdit.xhtml中我做

<ui:repeat value="#{items}" var="item">
  <tr>
    ...
    ...
    <td style="text-align: center">
      <h:commandLink style="cssGenericColumn" action="#{itemEditAction}">
         <f:setPropertyActionListener target="#{itemToEdit}" value="#{item}"/>
      </h:commandLink>    
    </td>
  <tr>
</ui:repeat>
Run Code Online (Sandbox Code Playgroud)

这导致以下错误失败

javax.faces.el.EvaluationException: /WEB-INF/Subviews/ProductEdit.xhtml @45,89 action="#{itemEditAction}": Identity 'itemEditAction' does not reference a MethodExpression instance, returned type: java.lang.String
at com.sun.facelets.el.LegacyMethodBinding.invoke(LegacyMethodBinding.java:    at org.apache.myfaces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:    at javax.faces.component.UICommand.broadcast(UICommand.java:109)....
 ....
 ....
 ....
Run Code Online (Sandbox Code Playgroud)

但是,如果操作绑定到模型对象,则此方法有效.所以像

 <h:commandLink style="cssGenericColumn" action="#{item.editAction}">
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Cri*_*riu 48

将方法作为参数传递应该以这种方式完成:

itemBean="#{bean}"
itemEditAction="productEditAction"
Run Code Online (Sandbox Code Playgroud)

在你的组件中,你会把它们放在一起:

action="#{itemBean[itemEditAction]}"
Run Code Online (Sandbox Code Playgroud)

  • 保佑你先生!你救了我把拳头放在显示器上,或者更糟糕的是,不得不重新设计我的应用程序. (6认同)