Grails 当发布到控制器时,带有

Grails 当发布到控制器时,带有,grails,bootstrap-4,form-submit,gsp,Grails,Bootstrap 4,Form Submit,Gsp,GrailsV3.3.9和引导 在处理JavaLocalDateTime时,我一直在努力让grails、fields和bootstrap愉快地工作。快到了,但还不完全 我创建了一个/fields/localdateTime/\u widget.gsp,如下所示 <div class="input-group date col-sm-8" > <input id="${property}-label" name="${property}" type='datetime-

GrailsV3.3.9和引导

在处理JavaLocalDateTime时,我一直在努力让grails、fields和bootstrap愉快地工作。快到了,但还不完全

我创建了一个/fields/localdateTime/\u widget.gsp,如下所示

<div class="input-group date col-sm-8"  >
    <input id="${property}-label" name="${property}" type='datetime-local' class="form-control" value="${value}" placeholder="<empty>"/>
    <div class="input-group-append" >
        <button class="btn btn-icon-fixed-width btn-outline-secondary btn-block" disabled aria-disabled="true" type="button" >
            <i class="fas fa-calendar"></i>
        </button>
    </div>
</div>
然而,虽然它看起来不错,但当您尝试验证它时,它失败了

浏览器上呈现的是属性ldtProp类型不匹配。LocalDateTime验证有什么问题

我可以创建grails引导数据并保存到db,这样在保存时就不会是域类,也不会是验证,而是记录被传递到控制器时才会被破坏

我尝试了一个与LocalDate等效的字段,它似乎可以正常工作并正确验证,并且我可以保存发布到控制器更新操作的对象

这太令人沮丧了,有人能解释一下这失败了什么,以及如何纠正它吗

这最后一点把我难住了

为了弄清楚fields插件到底在做什么,我这里有一个私有版本


我把它作为字段的私有克隆插件运行,因为我看不到封面下发生了什么,所以它有很多库和样式表导入,这样我就可以进行现场调试。各种/fields/xxx/*gsp定义用于呈现引导表单/显示位。

Blimey,另一组蠕虫


首先,浏览器呈现它的方式无关紧要。。。而且可能与语言环境有关。它似乎将ISO日期时间作为重要的输入和输出。我建议在grails中处理这个问题的最干净的方法是在域对象上使用@BindUsing语法,因为不幸的是,grails本身不支持使用ISO datetime设置日期时间。然而,更大的问题是Firefox和Safari不支持datetime local,这对我来说非常不幸。
def update(BootstrapTest bootstrapTest) {
    if (bootstrapTest == null) {
        notFound()
        return
    }


    if (!bootstrapTest.validate()){
        println "object delivered to update action from edit form doesnt validate "
        respond bootstrapTest.errors, view:'edit'
        return
    }
def update(BootstrapTest bootstrapTest) {
    if (bootstrapTest == null) {
        notFound()
        return
    }

    LocalDateTime ldtProp
    LocalDate dtProp

    if (bootstrapTest.hasErrors()) {
        bootstrapTest.clearErrors()
        try {
            ldtProp = LocalDateTime.parse(params.ldtProp?.toString()) //ISO_LOCAL_DATE_TIME
            dtProp = LocalDate.parse(params.dtProp?.toString(), DateTimeFormatter.ISO_LOCAL_DATE) //ISO_LOCAL_DATE
            bootstrapTest.ldtProp =  ldtProp
            bootstrapTest.dtProp = dtProp
            bootstrapTest.validate()
        } catch (ex) {
            println "exception $ex.message"
            respond bootstrapTest.errors, view:'edit'
            return
        }
    }


    try {
        bootstrapTestService.save(bootstrapTest)
    } catch (ValidationException e) {
        respond bootstrapTest.errors, view:'edit'
        return
    } ...