2013-10-12 37 views
7

我想要將一個seq文本綁定到一個scala窗體。我至今是下面的代碼:玩!框架與scala - 窗體seq(文本)綁定

val registerForm = Form[User](
mapping(
    "login" -> text, 
    "password" -> text, 
    "roles" -> seq(text) 
) { 
    (login, password, roles) => User(login = login, password = password, roles = roles) 
} { 
    user => Some((user.login, user.password, user.roles)) 
}) 

我的HTML表單中選擇是:

<select id="roles" name="roles" multiple="multiple"> 
    <option value="ADMIN">Admin</option> 
    <option value="TESTER">Tester</option> 
</select> 

登錄名和密碼是否正確綁定。我的問題是角色的seq總是空的。

我檢查了傳遞給控制器​​方法的請求對象,(如果選中)兩個角色都存在 - 它們只是在表單對象中沒有正確綁定。

任何想法?

編輯:

我也貼在作怪框架谷歌集團(https://groups.google.com/forum/#!topic/play-framework/KcbiF9K3d8w)接收的答案有我的問題和。 解決方案是選擇一個名稱:「角色[]」而不是「角色」。

+2

你能張貼的答案部分答案,並將其標記爲正確的答案? –

回答

4

想通了。

解決方案是選擇一個名稱:「角色[]」而不是「角色」。

+0

這真的令人難以置信..感謝,作品像一個魅力! – mulya

0

一個的Java播放的播放Form綁定到selectmultiple屬性2.3.7例如:

<select name="bar[]" multiple> 
     <option value="bar-1">Bar</option> 
     <option value="bar-2">Bar Bar</option> 
     <option value="bar-3">Bar Bar Bar</option> 
</select> 

隨着Form

public class FooForm { 
    public List<String> bar; 
} 

而且Controller結合:

FooForm fooForm = Form.form(FooForm.class).bindFromRequest().get(); 
Logger.info(fooForm.bar.get(0)); 
Logger.info(fooForm.bar.get(1)); 

我已經測試過數組(即String[]),它似乎只適用於List<>

希望這會有所幫助。


注: 奇怪的是,當Form類(FooForm)是在同一個包作爲控制器,或在相同的類和static這僅適用。這似乎是一個錯誤。

如果要使用不同的包(即controllers.forms),那麼你需要在你的窗體類getter和setter方法:

public class FooForm { 
    private List<String> bar; 

    public List<String> getBar() { return bar; } 
    public void setBar(List<String> bar) { this.bar = bar; } 
}