处理具有可重复输入的表格

时间:2014-11-17 07:44:26

标签: grails

在我开始提出问题之前,我会尝试解释我想要做什么。

我正在使用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
}

但仍然没有工作。

所以任何人都对此有任何想法?

1 个答案:

答案 0 :(得分:0)

我正在查看此块,您将dataInputInstance.inputA设置为单个值而不是整个列表对象。这是你的意图吗?

dataInputInstance.inputA = params.inputA[i].trim()
dataInputInstance.inputB = params.inputB[i].trim()

如果不是原因,您可以发布您的观看GSP代码吗?需要了解如何从验证失败的视图中读取值。