在我开始提出问题之前,我会尝试解释我想要做什么。
我正在使用Grails创建表单,在表单中,有2个部分,主要输入和可重复输入。请参阅下文,了解结构的外观。
<div class="primary">
<div class="${hasErrors(bean: dataInputInstance, field: 'mainInput', 'error')}">
<label class="control-label">
<g:message code="dataInput.mainInput.label" default="Main Input"/>
</label>
<div class="controls">
<g:textField name="mainInput" value="${dataInputInstance?.mainInput}" />
</div>
</div>
</div>
<div class="repeatable">
<div class="span6">
<div class="${hasErrors(bean: dataInputInstance, field: 'inputA', 'error')}">
<label class="control-label">
<g:message code="dataInput.InputA.label" default="Input A"/>
</label>
<div class="controls">
<g:textField id='inputA_1' name="inputA" value="${dataInputInstance?.inputA}" />
</div>
</div>
</div>
<div class="span6">
<div class="${hasErrors(bean: dataInputInstance, field: 'inputB', 'error')}">
<label class="control-label">
<g:message code="dataInput.InputB.label" default="Input B"/>
</label>
<div class="controls">
<g:textField id='inputB_1' name="inputB" value="${dataInputInstance?.inputB}" />
</div>
</div>
</div>
输入的可重复部分可重复1-50次。在数据库中生成和保存的实例数取决于创建的重复表单的数量。每个实例都是主输入+重复输入的组合。
如果说,我创建了5个重复的部分,那么在保存表单时,参数将如下所示
参数:[mainInput:valMain,inputA:[valA1,valA2,valA3,valA4,valA5],inputB:[valB1,valB2,valB3,valB4,valB5]]
在控制器中,当我尝试构建实例并将其保存到数据库时,我使用了以下内容
def save() {
def length = inputA.size()
def i
if (i = 0; i < length; i++){
DataInput dataInputInstance = new DataInput()
dataInputInstance.mainInput = params.mainInput.trim()
dataInputInstance.inputA = params.inputA[i].trim()
dataInputInstance.inputB = params.inputB[i].trim()
dataInputInstance.save(flush:true)
}
}
到目前为止,我设法使这部分正确。
现在问题来了。
在保存控制器内部,我打算在将数据保存到数据库之前包含一些数据检查。如果检查成功,则它将继续保存数据。如果不是,那么它将返回到表单页面,以及用户在表单中输入的数据。其代码如下
if (insert checking condition here){
render(view: "create", model: [dataInputInstance: dataInputInstance]) //If fail
}
如果可重复部分的数量为1,则表单将与用户输入的数据一起呈现。但是,如果可重复部分大于1,那么将数据传回表单将会很困难。
我试图将params传回表单,因为我认为因为params包含数组,所以将params传回表单是合乎逻辑的,如下所示
if (insert checking condition here){
render(view: "create", model: [dataInputInstance: params]) //If fail
}
但仍然没有工作。
所以任何人都对此有任何想法?
答案 0 :(得分:0)
我正在查看此块,您将dataInputInstance.inputA设置为单个值而不是整个列表对象。这是你的意图吗?
dataInputInstance.inputA = params.inputA[i].trim()
dataInputInstance.inputB = params.inputB[i].trim()
如果不是原因,您可以发布您的观看GSP代码吗?需要了解如何从验证失败的视图中读取值。