grails命令对象id字段的数据绑定

时间:2011-06-19 00:31:57

标签: data-binding grails

使用命令对象时,似乎我没有自动绑定id字段

class somethingCommand {

 int id
 String A
 String B

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

}

我的A和B字符串从表单属性中获取自动魔术数据,但不是id。 grails的其他“隐藏字段”如version,dateCreated或lastUpdated也正确绑定。

我目前修补的解决方案如下: 我求助于在我的表单中定义另一个隐藏的id字段

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

并在命令obect中将id重命名为blogId,并且无效。

这似乎与Grails的优雅不符。我在Command对象与控制器的数据绑定规则中缺少什么?

2 个答案:

答案 0 :(得分:7)

跟进此问题:

我遇到了同样的问题:我有一个带有 id 参数的命令。在使用该命令的操作上调用我的控制器时,除了 id 之外,所有参数都已正确绑定。

事实证明,如果您的命令中有一个名为 version 的字段,则不会分配 id 字段。

如果您更改其他内容的版本字段名称(即readVersion),则ID将正确映射。

希望有所帮助,

Vincent Giguere

答案 1 :(得分: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或int,并且您的命令对象将具有

command.id = null

所以,我的建议是:重新开始并从头开始重写你的表单并确保你的表格中的值,正如你从控制器的 params.id 中看到的那样与你的命令的id字段类型。

让我知道它是怎么回事。

VincentGiguère

相关问题