2011-09-01 131 views
0

我试图渲染一个按钮,该按钮应该最初呈现禁用状态,并且在某些时候由客户端操作启用。我使用的组件从A4J用下面的代码:在JSF中呈现禁用的按钮

<a4j:commandButton id="myButton" disabled="true" onclick="myFunction()"> 

问题是,当残疾人属性设置为true,则事件不会附着的组件,导致此HTML代码:

<input type="button" onclick="return false" ... /> 

所以,当我尝试启用通过JavaScript,启用按钮,但按钮没有附加事件侦听器。

到目前为止,只有两个解决方案,我能想到的是:

  • 分配残疾人属性值的bean属性,并重新呈现按钮。
  • 渲染最初启用,通过JavaScript

这两个选项的工作,但他们不是很干净负载页面上禁用,我不希望我每次启用按钮进行申请到服务器。

回答

2

这就是JSF的基于状态的基于组件的MVC框架的工作原理。作为防范被篡改/被黑客请求的一部分,框架在每次要应用请求值时重新评估输入元素的disabled(和rendered)属性。否则,最终用户将能够调用他们不允许通过服务器端限制进行的操作或提交值,这些限制可能会使得攻击机会敞开大门。

你提到的两种解决方案都非常好。如果你不想让最终用户篡改/破解它,我会选择第一个。它可以通过ajax轻松完成。

+0

重新渲染的问题在于启用/禁用被附加到由onRowClick事件控制的两个表的状态,并且我不想让我的服务器泛滥不必要的请求。 – jasalguero

+0

然后去找你的第二个选项,如果安全不是你关心的话。 – BalusC

+0

我没有看到那种情况下的安全缺陷?通过JavaScript启用/禁用组件有什么问题?我认为它更像是一个商业问题,因为它可能不会发送所有需要的数据,但有了正确的验证/卫生设施,它可以解决它,有没有我没有看到的东西? – jasalguero