我试图在两个不同的命令按钮之间切换,具体取决于列表是否包含给定的项目ID:
<c:if test="#{roomServiceManagerBean.holdinghotelvilla.contains(hotel.hotelvillaId)}">
<p:commandButton ajax="true" id="commanddeactivate" update=":roomserviceForm:hoteltable,:roomserviceForm:msgs" actionListener="#{roomServiceManagerBean.deactivateServiceForHotel(hotel.hotelvillaId)}" icon="ui-icon-radio-off" type="submit" value="Remove Service">
<f:param name="roomserviceid" value="#{roomServiceManagerBean.roomServiceId}" />
</p:commandButton>
</c:if>
<c:otherwise>
<p:commandButton id="commandactivate" update=":roomserviceForm:hoteltable,:roomserviceForm:msgs" actionListener="#{roomServiceManagerBean.activateServiceForHotel(hotel.hotelvillaId)}" icon="ui-icon-radio-on" type="submit" value="Provide Service">
<f:param name="roomserviceid" value="#{roomServiceManagerBean.roomServiceId}" />
</p:commandButton>
</c:otherwise>
然而,它失败并且两个按钮都出现了。这是怎么造成的,我该如何解决?
答案 0 :(得分:1)
如果<c:if>
在视图构建期间不可用,则此#{hotel}
中的<p:dataTable var>
将失败,但仅在视图渲染时间内(例如因为它被定义为<c:otherwise>
)。 <c:choose><c:when>
完全取代了这里。它属于<c:if>
。从技术上讲,您应该使用test
代替<c:if>
中的否定。或者,您应该用<c:when>
替换第一个<c:choose>
并将整个内容包装在#{hotel}
中。但是,如果在视图构建期间rendered
不可用,那么仍然会失败。
只需使用JSF组件的<p:commandButton ... rendered="#{roomServiceManagerBean.holdinghotelvilla.contains(hotel.hotelvillaId)}">
...
</p:commandButton>
<p:commandButton ... rendered="#{not roomServiceManagerBean.holdinghotelvilla.contains(hotel.hotelvillaId)}">
...
</p:commandButton>
属性。
{{1}}