2011-06-19 47 views
7

當使用命令對象,似乎我沒有得到自動ID字段的結合Grails命令對象數據id字段

class somethingCommand { 

int id 
String A 
String B 

// some methods here like Domain.get(id) 

} 

我的A和B線得到窗體屬性綁定自動神奇數據,但結合不是身份證。像版本,dateCreated或lastUpdated這樣的Grails的其他「隱藏字段」也可以正確綁定。

我目前的解決方案補丁是: 我求助於我的形式

<g:hiddenField name="blogId" value="${blog?.id}"/> 

定義另一個隱藏的id字段,並在命令obect重命名id來blogId和工程。

這似乎不符合Grails的優雅。 Command對象vs控制器的數據綁定規則中缺少什麼?

+0

在表單中以前ID添加的隱藏字段之前?它是否與名稱= id的隱藏字段一起工作?數據綁定算法將嘗試並將字段與屬性名稱進行匹配 - 也許有多個id字段,並且它會變得混亂? –

+0

加強Stéphane... :) –

回答

7

跟進這個問題:

我遇到了同樣的問題:我曾與ID參數的命令。在使用該命令的操作中調用我的控制器時,除id之外的所有參數都已正確綁定。

原來,如果你在你的命令有一個名爲版本領域,ID場將不會分配。

如果您更改您的版本字段的其他名稱(即。readVersion),則該ID將正確映射。

希望幫助,

文森特Giguere

+1

接下來,這是一個功能,我首先假設錯誤。 http://jira.grails.org/browse/GRAILS-6190 –

3

我已經使用了這幾次。

id參數與任何其他字段綁定到您的命令。在這個特定領域沒有特殊的行爲

現在,如果您提交的id字段的值與命令的id字段的類型不兼容,那麼該字段將不會被綁定。你會而不是得到一個ClassCastException或類的任何東西。你只會得到該字段的空值。

我記得看到一些棘手有關:如果你有一個ID在這兩個您的網址(例如控制器/動作/ ID)。在窗體,然後從URL中的ID優先。

所以,如果您的形式有ID

<field type="hidden" name="id" value="1"/> 

適當的隱藏字段,但行動以某種方式搞砸了你的表格上

<g:form action="doSometing" id="some-incompatible-value">...</g:form> 

那麼您將收到該控制器是什麼:

params.id = "some-incompatible-value" 

這會讓grails無法將您的id參數轉換爲long或a ñint和您的命令對象有

command.id = null 

所以,我的建議是:從頭開始,從頭重寫你的表格,並確保在你的價值構成,當你從你的控制器的看到它params.id與您的命令的id字段類型兼容。

讓我知道它是怎麼回事。

文森特Giguère