2011-03-25 54 views
2

我想要生成一個html選擇元素預選一個選項。我無法想象用stringtemplate來做這件事的方法。stringtemplate:問題生成HTML選擇與預選

如果user.choice設置爲「B」,那麼我想打印一個html選擇元素,並且預先選擇了B選項。

user.choice = "B"; 
StringTemplate myPage = group.getInstanceOf(....); 
myPage.setAttribute("user", user); 

上打印的模板應產生:

<select> 
    <option value="A"    >A Selected</option> 
    <option value="B" SELECTED >B Selected</option> 
    <option value="C"    >C Selected</option> 
    <option value="D"    >D Selected</option> 
</select> 

誰能告訴我怎麼寫模板這樣做。選項(A,B ...)的數量是固定的(在編寫模板時已知)。

這是爲網站生成html頁面時相當常見的需求。但是對於傳遞值的比較操作似乎沒有什麼可以在stringtemplate中使用。我錯過了明顯的東西嗎?

我正在使用stringtemplate組(.stg)文件,因此具有引用其他模板的模板的解決方案都很好。在java中使用stringtemplate 3.2.1。使用「$」分隔符而不是現在默認的「<>」來簡化html生成。

回答

3

StringTemplate強制視圖和模型之間非常嚴格的分離。它不支持在布爾值以外的其他任何地方執行conditional operations。我認爲引擎真的希望你在將數據傳遞給渲染之前完成了計算。

我建議存儲值與實際列表項自己。假設你已經在「list」對象上有一個「value」和「text」屬性(它們存儲在你的集合中),你也可以在列表項中添加一個選定的布爾屬性。然後,您可以使用它,如下所示:

<select> 
$list:{ l | 
<option value=$l.value$ $if(l.selected)$selected="selected"$endif$>$l.text$</option> 
}$ 
</select> 
+0

這裏有一個相關的問題:http://stackoverflow.com/questions/4195828/stringtemplate-compare-strings-does-not-work – 2011-03-26 06:15:15

+0

@伊恩 - 羅伯遜我欣賞嚴格的分離是stringtemplate的更好的部分。這個用例看起來很普遍,所以我認爲可能有一個確定的技術/模式,似乎沒有。 – sundoe 2011-03-26 15:32:55

+1

我相信這是一個確定的模式,並且在將模板與模板混搭之前,它已經獲得了您喜歡的模型。也許你正在尋找規則的既定例外情況? :) – 2011-03-26 15:37:02