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

Posted

技术标签:

【中文标题】Grails:如何消除 create.gsp 和 save.gsp 并将其移动到 list.gsp 中列表的第一行?【英文标题】:Grails: How do I eliminate the create.gsp and save.gsp and move it to the first line of the list in list.gsp? 【发布时间】:2010-10-22 15:23:17 【问题描述】:

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

但现在我不知道如何将其与其余数据联系起来并使其发挥作用。

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

这是第一行的样子

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

我还可以使用擦除按钮。所以基本上唯一缺少的是更新按钮。

有什么想法吗??

提前致谢!

编辑

这是我在控制器中的内容:

    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 >
                            <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>

【问题讨论】:

【参考方案1】:

为了摆脱 create.gsp 和 edit.gsp,控制器的操作应该与脚手架中的操作完全一样,除了 save 和 update 应该以

结尾
redirect(action: list)

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

该行格式应该包含所有对象属性,当然。

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。这也适用于“撤消”操作。

【讨论】:

OTOH,您打算如何撤消对 GUI 中表格行的更改? 好吧,我在列表中的所有元素中都包含了文本字段,所以我只需要更新按钮。如果要撤消某些操作,则必须刷新页面。不过好点。 每一行都有自己的&lt;g:form&gt;。它仍然无法正常工作。如果在控制器中我创建了一些 if(params?.Rcommodity) ... ?? 对不起,我不明白。能否引用表格行 GSP 代码并更新代码? 这是它创建的第一行。如果您想要创建所有内容的第一行的代码,我也可以发布它,但更长。我认为我在 def update 中遗漏了一些东西,而不是 gsp 中的实际 html 代码【参考方案2】:

我认为问题在于您的 actionSubmits 正在提交包含它们的表单,并且您的数据元素位于外部表单中,因此您的更新操作调用没有收到任何要更新的数据。如果您在更新操作的顶部放置一些调试,您可以证明或反驳这个理论。 println "$params"

【讨论】:

以上是关于Grails:如何消除 create.gsp 和 save.gsp 并将其移动到 list.gsp 中列表的第一行?的主要内容,如果未能解决你的问题,请参考以下文章

Grails - 简单的 hasMany 问题 - 在 create.gsp 中使用 CheckBoxes 而不是 HTML Select

Grails Scaffolding Templates - 从域类中获取属性

grails 控制器可以从基类扩展吗?如何让它不会爆炸?

如何从 Grails 控制器和视图外部引用 Grails 域类字段?

如何优化 Grails 构建和测试执行速度?

如何设置 Grails 和 AngularJS 部分模板