【问题标题】:Grails - How to send one ID from view to controller (many-to-many relationship)Grails - 如何将一个 ID 从视图发送到控制器(多对多关系)
【发布时间】:2015-12-29 04:35:58
【问题描述】:

我正在尝试发送迭代项目的 ID,但我认为正在发送整个列表。如何只发送一个 ID? 我有STUDENTCOURSE 域类。

领域模型

class Student {
    String fullName
    String toString() {
        "$fullName"
    }

    static belongsTo = [school: School]
    static hasMany = [courses:Course, studentCourses:StudentCourse]
}

class Course {
    String course
    String toString() {
        "$course"
    }

    static hasMany = [studentCourses:StudentCourse]
    static belongsTo = Student

}

class StudentCourse {
    Student student
    Course course

    //Some methods...
}

这是我的编辑视图。

<g:if test="${studentInstance.studentCourses?.course}">
        <g:each class="courseList" in="${studentInstance.studentCourses?.course}" var="courses">
            <li class="courseList">
                <span class="courseList" aria-labelledby="courses-label">${courses.id} ${courses}
                <g:actionSubmitImage class="deleteIcon" action="deleteCourse" value="delete"
                 src="${resource(dir: 'images', file: 'delete.png')}" height="17"
                 onclick="return confirm('${message(code: 'default.button.delete.confirm.message', default: 'Are you sure?')}');"
                 params="${courses.id}"/></span>
            </li>
        </g:each>
    </g:if>

当用户点击delete.png 图片时,我希望能够从列表中删除一门课程。但是当我println params.course 时,参数作为整个列表发送,而不是作为列表的单个项目发送,即使它在g:each 标记内。我怎样才能只向控制器发送一个相应的项目?

我的编辑页面有一个课程列表。

Course 23  English (delete icon here)
       42  Science (delete icon here)
       67  Math (delete icon here)

在我的println params.course 中,这是我看到的。

[ English, Science, Math ]

当用户单击English 行旁边的删除按钮时,我怎么才能只有[English]

提前谢谢你。

【问题讨论】:

  • 这种情况在每个浏览器中都会发生,还是您只在 IE 中看到?
  • 我使用的是谷歌浏览器,但 println 命令正在从控制器发送到控制台。

标签: grails many-to-many parameter-passing grails-2.4


【解决方案1】:

据我了解你的问题,问题应该出在你的 taglib 中

我给你一个类似代码的例子,这是有效的。

<g:each in="${student?.studentCourses?.course}" var="course">
<div>
    <span>${course.id} ${course.course}</span>
    <g:link controller="login" action="delete" params="[courseId:course.id]">
        Delete
    </g:link>
</div>

在此代码块中,通过单击 delete 链接,其中 params 具有 params="${[id:course.id]} ,它将重定向到 login 控制器内的 delete 操作。在删除操作中打印参数,您将获得输出为 参数:[courseId:2, action:delete, format:null, controller:login] 在这里您可以看到您的 params.courseId 只是一个 Long 值 而不是列表。

希望它能帮助你理解你的问题。

【讨论】:

  • 我试过了,但它爆炸了,说不能在空对象上打印 id。但是,如果我使用params="${[courseId:courses.id]}",它会像这样打印整个条目。
  • [startDate:date.struct, school.id:1, school:[id:1], _action_deleteCourse:delete, endDate:date.struct, endDate_month:12, _method:PUT, endDate_day:31 , endDate_picker:12/31/2015, endDate_year:2015, version:7, startDate_month:12, _action_deleteCourse.y:14, action_deleteCourse:[_x:15, _y:14], _action_deleteCourse.x:15, startDate_day:7, startDate_year :2011, course:[English, Science, Math], fullName:John Doe, startDate_picker:12/07/2011, id:121, action:update, format:null, controller:student]
  • 您的输出表明您正在标记库中进行一些处理。您的 taglib 负责此输出。
  • params="${[courseId:course.id]}" 应该是 params="[courseId:course.id]"。不需要${ }
  • 将您的 actionSubmitImage 标签库更改为一个简单的按钮,并使用
猜你喜欢
  • 1970-01-01
  • 2015-09-25
  • 1970-01-01
  • 2015-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-17
  • 2013-04-21
相关资源
最近更新 更多