0

如果我有如下表格

<input type="text" name="someCollection[0].someAssociation.id"/>
<input type="text" name="someCollection[1].someAssociation.id"/>
<input type="text" name="someCollection[2].someAssociation.id"/>

因为 Grails 在遇到.id后缀时会提供自动数据绑定,所以 Grails 似乎使用get方法而不是load方法,这意味着 3 个查询如下

SELECT * FROM SomeAssociationClass WHERE id = ?
SELECT * FROM SomeAssociationClass WHERE id = ?
SELECT * FROM SomeAssociationClass WHERE id = ?

我只需要加载方法,因为它不会命中数据库,除非您使用 getId() 以外的方法(未应用)。那么,如何自定义数据绑定以使其使用加载方法?

4

2 回答 2

0

您可以在提交表单时使用命令对象来绑定数据。

@Validateable
class ExampleCO {
String username
// here will be your field name which you use on view ,both name will same as in domain class.
static constraints = {
username nullable: false
    // here you can provide same constraints as you define in your domain classes. It will also check validation on field here.

  }
}

因为你可以这样写 vale 。

 <g:form action="saveSkills" method="POST">`
<g:textField name="name" id="skillName" class="skillName" value="${exampleCO?.username}"
                                 placeholder="Add your skill" style="width: 280px"/>
</g:form>

当您填写表格并点击操作以保存它时。字段名称将与命令对象中的名称相同。然后在行动中,您可以像这样在 Command 对象中接收它,

def actionName(ExampleCO exampleCO){
  DomainClass domainClass = new DomainClass()
  binddata(domainClass,exampleCO)
 domainClass.save()
 }

希望它会有所帮助,如果我很好地理解你的问题。

于 2013-08-10T18:14:40.700 回答
0

为了避免加载数据库的实例,我们需要删除.id后缀并注册一个自定义的 propertyEditor,它负责调用load方法

class AppPropertyEditorRegistrar implements PropertyEditorRegistrar {

    void registerCustomEditors(PropertyEditorRegistry registry) {
        registry.registerCustomEditor(Question, new PropertyEditorSupport() {
        @Override
            void setAsText(String value) {
                setValue(Question.load(value as Long))
            }
        })
    }

}
于 2013-08-11T00:47:21.843 回答