Grails:如何消除 create.gsp 和 save.gsp 并将其移动到 list.gsp 中列表的第一行?

标签 grails save

我想摆脱 create.gsp 和 save.gsp 并将所有内容都放在同一页面上。
我所做的是将所有这些字段移到 list.gsp 中列表的第一行

但现在我不知道如何将它与其余数据连接起来并使其工作。

我必须让创建按钮工作。但是后来我无法使更新按钮起作用。

这是第一行的图片



一切都在第一行中创建,然后单击 CREATE 并使用放入文本字​​段中的所有数据创建新行。第一行没有 ID,但其他所有行都有。

我也让删除按钮工作。所以基本上唯一缺少的是更新按钮。

有任何想法吗??

提前致谢!

编辑

这是我在 Controller 中的内容:

    def update = {

            def densityInstance = Density.get(params.id)
            if (densityInstance) {
                if (params.version) {
                    def version = params.version.toLong()
                    if (densityInstance.version > version) {

                        densityInstance.errors.rejectValue("version", "default.optimistic.locking.failure", [message(code: 'density.label', default: 'Density')] as Object[], "Another user has updated this Density while you were editing")
                        render(view: "list", model: [densityInstance: densityInstance,'Rcommodity':params?.Rcommodity])
                    }
                }
                densityInstance.properties = params
                if (!densityInstance.hasErrors() && densityInstance.save(flush: true)) {
                    flash.message = "${message(code: 'default.updated.message', args: [message(code: 'density.label', default: 'Density'), densityInstance.id])}"
                    redirect(action: "list", id: densityInstance.id)
                }
                else {
                    redirect(action: "list", id: densityInstance.id)
                }
            }
            else {
                flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'density.label', default: 'Density'), params.id])}"
                redirect(action: "list")
            }
        }

而且由于 grails 是按列执行的,所以行有点乱,但它是:
<g:each in="${densityInstanceList}" status="i" var="densityInstance">
                    <g:form action="update">
                        <tr class="${(i % 2) == 0 ? 'even' : 'odd'}">
                            <td>${fieldValue(bean: densityInstance, field: "id")}</td>
                            <td><g:textField name="Rcommodity" value="${densityInstance?.commodity}"  class="input" onKeyPress="return alpha(event)"/>&nbsp;<img src="${resource(dir:'images/skin',file:'information.png')}" ></td>
                            <td><g:textField name="Rorigin" value="${densityInstance?.origin}" maxlength="3" size="5" class="input" onKeyPress="return alpha(event)"/>&nbsp;<img src="${resource(dir:'images/skin',file:'information.png')}" ></td>
                            <td><g:textField name="Rshipper" value="${densityInstance?.shipper}" size="3" class="input" onkeypress="return IsNumeric(event)"/> <g:textField name="RshipperName" value="${densityInstance?.shipperName}" size="15" class="input-b" onfocus="this.blur()"/>&nbsp;<img src="${resource(dir:'images/skin',file:'information.png')}" ></td>
                            <td><g:textField name="Ragent" value="${densityInstance?.agent}" size="3" class="input" onkeypress="return IsNumeric(event)"/> <g:textField name="RagentName" value="${densityInstance?.agentName}" size="15" class="input-b" onfocus="this.blur()"/>&nbsp;<img src="${resource(dir:'images/skin',file:'information.png')}" ></td>
                            <td><g:textField name="Rdest" value="${densityInstance?.dest}" size="5" class="input" onKeyPress="return alpha(event)"/>&nbsp;<img src="${resource(dir:'images/skin',file:'information.png')}" ></td>
                            <td><g:textField name="Rdensity" value="${densityInstance?.density}" size="15" class="input" onkeypress="return IsNumeric(event)"/></td>
                            <td><g:textField name="RAM" value="${densityInstance?.AM}"  size="1" class="input"/></td>
                            <td width="100">
                            <g:form>
                                <g:hiddenField name="id" value="${densityInstance?.id}" />
                                <g:actionSubmit class="editar" action="update" value="${message(code: 'default.button.editar.label', default: '&nbsp;&nbsp;&nbsp;')}" />
                                <g:actionSubmit class="eliminar" action="delete" value="${message(code: 'default.button.eliminar.label', default: '&nbsp;&nbsp;&nbsp;')}" onclick="return confirm('${message(code: 'default.button.delete.confirm.message', default: 'Esta seguro que desea Eliminar?')}');" />
                            </g:form>
                            </td>
                        </tr>
                    </g:form></g:each>

最佳答案

为了摆脱 create.gsp 和 edit.gsp,您的 Controller 的操作应该与脚手架中的操作完全相同,除了 save{} 和 update{} 应该以

redirect(action: list)

为了使“更新”按钮起作用,每个“更新”都应将其表单(表格的一行)提交给“更新”操作。关于 update{} 的其他所有内容都应保持原样。

当然,该线形应该包含所有对象属性。

更新 在代码示例之后。
  • (编辑:哦,我一直误读代码)为什么需要 2 个嵌套的 g:forms?我会试着和一个一起去。只需调试提交到更新操作的内容 - 执行 params包含对象字段。
  • 我还会在代码中消除对 redirect(action: "list") 的过多调用。
  • 看起来您没有在列表操作中使用 ${id} ?如果是这样,您不必将其作为列表操作参数传递。
  • 我相信,有一天您会希望通过 Ajax 提交表格行。 .为此,将每一行包含在
    中,将该行提取到单独的模板中,然后提交给另一个操作,比如 ajaxUpdate,它会做同样的事情,但以 render 结尾(模板:'lineTemplate')。然后将 g:form 替换为 g:formRemote update="[success:'line${densityInstance.id}',failure:'line${densityInstance.id}']"和 viola。这也适用于“撤消”操作。
  • 关于Grails:如何消除 create.gsp 和 save.gsp 并将其移动到 list.gsp 中列表的第一行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3998316/

    相关文章:

    grails - 如何配置Logback从Grails 3.x上的Bootstrap以INFO级别登录?

    grails - 如何在 Grails 中使用 JAXB 编码

    python - Python Paramiko 执行命令后如何保存结果?

    c++ - 将行附加到 Armadillo .mat 文件

    r - 如何指定R-shiny和shinyFiles保存文件的文件和路径?

    variables - 如何使用 Pillow 将动画 GIF 保存到变量

    域类 : No signature of method exception 的 Grails 集成测试

    grails - Grails GORM:常规 map

    java - 确保使用 GridFS - MongoDB Java API 完成文件插入

    grails - 从webapp目录播放mp4文件