2011-09-01 149 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