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)"/> <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)"/> <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()"/> <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()"/> <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)"/> <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: ' ')" />
<g:actionSubmit class="eliminar" action="delete" value="$message(code: 'default.button.eliminar.label', default: ' ')" 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 中表格行的更改? 好吧,我在列表中的所有元素中都包含了文本字段,所以我只需要更新按钮。如果要撤消某些操作,则必须刷新页面。不过好点。 每一行都有自己的<g:form>
。它仍然无法正常工作。如果在控制器中我创建了一些 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 - 从域类中获取属性