【问题标题】:Grails many to many passing multiple values from gsp to controller to saveGrails 多对多将多个值从 gsp 传递到控制器以保存
【发布时间】:2013-03-24 23:58:04
【问题描述】:

我在表单和事件之间有多对多关系,在使用连接表的列表中,当我在编辑模式下显示数据时,我在表中的自己的下拉列表中显示每个项目,而不是一个多选下拉列表.如果我想添加更多项目,我还有一个小 jQuery 可以添加额外的下拉菜单,我的问题是,我如何按顺序保存这组“事件”?代码如下:-

为表单加载所有链接事件的初始_form.gsp:-

   <table id="eventList">
        <g:each in="${formInstance?.events}" status = "i" var="item">
            <tr class="${(i % 2) == 0 ? 'even' : 'odd'}">
                <td>
                    <label></label>
                    <g:select name="event_${i}" from="${framework.Event.list()}" required="required" optionKey="id" value="${item.id}" />
                </td>
            </tr>
        </g:each>
    </table>

使用此 gsp 添加其他对象

<tr class="${((newRow+1) % 2) == 0 ? 'even' : 'odd'}">
    <td>
        <label></label>
            <g:select name="event_${newRow-1}" from="${framework.Event.list()}" required="required" optionKey="id" />
    </td>
</tr>

目前的保存按钮是这样的:-

<g:actionSubmit class="save" action="update" value="${message(code: 'default.button.update.label', default: 'Update')}" />

更新操作与从域设置中自动生成的操作相同。如何保存以识别添加的新字段?即使我改变了顺序,目前点击保存对“事件”也是如此......

领域类是这样的

import java.util.List;

class Form {
    static constraints = {
        formDesc(blank:false,maxSize:100,unique: true)
    }

    static mapping = {
        table "form"
        version false
        columns{
            id column:"form_id"
            formDesc column:"description"
            testscenarios joinTable:[name:"lnk_scenario_form",key:'form_id']
            events joinTable:[name:"lnk_form_event",key:'form_id']
        }
    }

    String formDesc
    List events

    static hasMany = [testscenarios:TestScenario, events:Event]
    static belongsTo = fartframework.TestScenario

    String toString (){
        "${formDesc}"
    }
}

class Event {
       static constraints = {
           eventTypeID()
           eventOrder()
           objectID()
           testDataID()
        }

    static mapping = {
        table "event_form"
        version false
        columns{
            id column:"event_form_id"
            eventTypeID column:"event_id"
            eventOrder column:"event_order"
            testDataID column:"test_data_id"
            objectID column:"object_id"

            forms joinTable:[name:"lnk_form_event", key:'event_id']
        }
    }

    EventType eventTypeID
    Integer eventOrder
    TestData testDataID
    Object objectID

    static hasMany = [forms:Form]
    static belongsTo = fartframework.Form

    String toString (){
        "${eventTypeID}"
    }
}

【问题讨论】:

  • 假设你的 hasMany 被命名为“events”,试试name="events[$i].id"
  • 当我将其更改为此然后尝试更改已经存在的事物的顺序时,我收到以下错误Violation of PRIMARY KEY constraint 'PK__lnk_form__7B3919BB0AD2A005'. Cannot insert duplicate key in object 'dbo.lnk_form_event'.. Stacktrace follows: Message: Violation of PRIMARY KEY constraint 'PK__lnk_form__7B3919BB0AD2A005'. Cannot insert duplicate key in object 'dbo.lnk_form_event'. 任何想法?它肯定比我以前的位置更远,什么也没发生! :)
  • 如果我添加一个新的下拉菜单然后尝试保存它,而不更改以前的字段,我也会收到此错误...如果我从头开始,但使用没有事件的表单,效果很好,但是一旦保存,我就无法更新或更改它:S 如果有任何用处,我正在使用 SQL 服务器...?
  • 你能发布你的域类吗?
  • 已按要求添加:)

标签: list grails save gsp


【解决方案1】:

原来这是因为我的链接表在 form_id 和 event_id 组合列上都设置了一个主键,我不在乎,因为我希望能够在其中有重复项(因为它的顺序更多重要),删除表上的这些主键值解决了问题!

我仍然有一个问题,如果我现在添加/删除很多次,我会遇到相同名称和代表问题的问题,但我可以通过一些 jquery hacking 来解决这个问题(我希望)......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多