如何更改 JSF 标记属性

Posted

技术标签:

【中文标题】如何更改 JSF 标记属性【英文标题】:How to change JSF tag attribute 【发布时间】:2013-12-22 02:26:08 【问题描述】:

我有一个 Primefaces 数据表。

<p:dataTable id="updateStaffTable" var="staff" value="#staffBean.staffs"  
                         selection="#staffBean.selectedStaff" selectionMode="single"
                         paginator="true" lazy="true" styleClass="dataTableSize" rows="10" >
<p:ajax event="rowSelect" listener="#staffBean.onRowSelect"   
                    update=":updateStaffForm:updateStaffPanelGrid" oncomplete="PF('updateStaffDialog').show()" /> 
</p:dataTable>

现在,如果不允许用户,我想禁用选择属性。我可以以编程方式检查用户的权限。我也有一个 bean 来检查,但我不能在这里使用渲染属性。我该如何做到这一点,或者有没有其他好的方法可以做到这一点?

【问题讨论】:

你不想在数据表中渲染一些行吗? 我有 CRUD 权限。如果用户只有读取权限,则不应选择该行。我想让他看到数据但不更新和删除数据。当用户选择一行时,会打开一个对话框窗口以进行更新和删除操作。 【参考方案1】:

只需像使用其他属性一样在属性中使用 EL。您可以使用条件运算符?: 在 EL 中执行 if-else。

例如仅当用户具有角色ADMIN 时才设置为single

selectionMode="#request.isUserInRole('ADMIN') ? 'single' : null"

至于为此建议 binding 的其他答案,建议在仅在视图侧实现该功能时使用 binding。如果你真的需要从 bean 上控制它,你甚至可以只做selectionMode="#bean.selectionMode"。尽量避免在支持 bean 属性上使用 binding,除非您需要动态填充组件,由于某些不清楚的原因无法在视图端完成(使用 JSTL,您可以做很多事情)。

【讨论】:

以上是关于如何更改 JSF 标记属性的主要内容,如果未能解决你的问题,请参考以下文章

从支持 bean 访问 JSF 组件标记属性值

我应该使用带有 render 属性的 ui:fragment 来有条件地在带有 JSF 2.2 的 Facelets 中呈现 HTML 标记吗?

如何使用选择更改标记属性 [vega-lite]

如何更改地图(而不是标记)的 Google Maps 可拖动属性?

具有渲染属性的jsf组件验证失败

如何在 JSF 页面中显示从属性文件加载的属性