2012-03-08 74 views
2
的組件

我正在使用< ui構建表格:重複>標記,其長度爲動態。每行有一個< h:inputText >字段。提交表單時,它將表單中的值設置爲散列表。除驗證外,這一切都很好。我需要使用「for」屬性告訴< h:消息>它屬於哪個輸入。我試圖根據用於創建該行的項目的名稱來創建每行唯一的ID。但< H:當我提交了無效的輸入消息>標籤保持爲空,而我得到下面的輸出上的服務器日誌(JBoss的7.1):JSF2 <h:message>無法找到ID爲

[javax.enterprise.resource.webcontainer.jsf.renderkit] 
Unable to find component with ID nTAS in view. 

這裏是XHTML:

<ui:repeat var="item" ...> 
... 
<h:inputText value="#{bean.chosenItems[item.name]}" id="n#{item.name}" > 
    <f:validateLongRange minimum="0" maximum="10" /> 
</h:inputText> 
<h:message for="n#{item.name}" /> 
... 
</ui:repeat> 

爲了至少獲得某種瀏覽器的錯誤信息,我也添加了這個靠近我的頁面的頂部,它的工作原理:

<h:messages styleClass="error" /> 

它會顯示這樣的信息:

j_idt13:j_idt17:1:n: Validation Error: Value is not of the correct type. 

而且那種問題的節目部分,因爲ID是在消息的開頭那個陌生的代碼,並將其與「N」開頭,但不包含該項目的名稱。如果我在瀏覽器中查看源代碼,則ID實際上是:id="j_idt13:j_idt17:1:nTAS"

如果我查看錶以外的其他組件,它們也有明顯由JSF生成的隱蔽ID。

什麼是真正奇怪的是,當我輸入「ASDF」第二次,並重新提交表單,然後調用bean上的操作方法,而不是在驗證階段再次失敗!怎麼可能?!

感謝您的任何提示, 約翰

回答

5

你不能用EL表達式動態創建的ID。如果你沒有給組件分配一個ID,那麼「隱藏的」ID實際上就是由jsf生成的。

但是您不需要關心ui:repeat中您的ID的唯一性。 JSF爲你做的(生成的id字符串中的「1」是你重複組件的計數器)。只要給你的輸入字段「固定的」 ID和您的H引用它:消息:

<h:inputText value="#{bean.chosenItems[item.name]}" id="myID" > 
    <f:validateLongRange minimum="0" maximum="10" /> 
</h:inputText> 
<h:message for="myID" /> 
+0

完美,而固定的第二個問題是,形式不被後續的提交驗證。謝謝! – 2012-03-08 21:27:22

+0

很高興聽到它的作品! – 2012-03-08 21:31:59