Grails 当发布到控制器时,带有
GrailsV3.3.9和引导 在处理JavaLocalDateTime时,我一直在努力让grails、fields和bootstrap愉快地工作。快到了,但还不完全 我创建了一个/fields/localdateTime/\u widget.gsp,如下所示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-
<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
} ...