【问题标题】:Handling form with repeatable inputs处理具有可重复输入的表单
【发布时间】:2014-11-17 07:44:26
【问题描述】:

在开始我的问题之前,我将尝试解释我正在尝试做的事情。

我正在使用 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 个重复的部分,那么在保存表单时,参数将如下所示

params:[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,那么将数据传回表单就会有麻烦。

我试图将参数传回表单,因为我认为因为参数包含数组,所以将参数传回表单是合乎逻辑的,如下所示

if (insert checking condition here){
    render(view: "create", model: [dataInputInstance: params]) //If fail
}

但还是不行。

那么有人对此有任何想法吗?

【问题讨论】:

    标签: grails


    【解决方案1】:

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

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

    如果这不是原因,您能否发布您的看法 GSP 代码?需要查看您如何从验证失败的角度读取值。

    【讨论】:

    • 就我而言,那部分是正确的。因为我将实例一一保存到数据库中,这就是我在那里使用循环的原因。参数包含从表单中检索到的所有值,因此为了验证,我只使用参数中的值。至于普惠制,这正是我提出的问题,也许不是全部,但只是与我的问题相关的重要部分。
    • 好的。失败时调用渲染后是否调用了返回?见this
    猜你喜欢
    • 2021-10-07
    • 2021-03-31
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    相关资源
    最近更新 更多