在Grails中处理模型,控制器和视图之间的不匹配的“正确”方法是什么?

| 当然,我的第一个Grails项目可能会在我的数据模型和UI设计师想要的演示之间出现疯狂的不匹配。 这是问题空间的简化说明: 杂货店里有三种配料:胡萝卜,芹菜和西红柿。该应用程序的目的是保存用户的购物清单:每个要购买多少。 Web设计人员希望通过多个HTML SELECT来完成此操作,因此您从下拉列表中选择要购买的成分,然后在其旁边键入数量。如果需要更多成分,请单击添加更多选择的JavaScript链接。 设计指定每个下拉菜单都相同,并且行数不受限制。因此,您可以获得一个包含5行的表格,分别对应3根胡萝卜,9根芹菜,2根芹菜,5根胡萝卜和1个番茄。 我从中应该得到的是订购8根胡萝卜,11根芹菜和1个番茄的订单。 我并没有深入探讨为什么这是糟糕的UI设计的所有争论,实际上,我想了解如何在存在这种不匹配的情况下,将模型/控制器映射到视图,以提交和最终编辑存储的提交。 我最初的想法是: 对于入站数据,请在Controller中根据参数和一些逻辑构造一个新的映射,以将值正确地添加到三个新的键/值对中,然后将该新映射传递给bindData方法,而不是请求参数映射本身。 为了呈现视图进行编辑,请使用afterInterceptor将模型的该部分重写为这些SELECT的正确数目,并认识到我原来的5行顺序在显示进行编辑时将变为3行。 但是,当我阅读有关Command对象的文章时,我想知道这是否是更好的方法。 我已经在线阅读了很多页面,但是看不到任何针对这种MVC不匹配的解决方案。 撇开明显的答案(与设计者作战),“ Grails”的处理方式是什么?     
已邀请:
我认为您的最初想法应该可行。使用命令对象可以将构建域对象的逻辑移出控制器方法,而不是必需的。如果您向购物清单中添加了更多信息(名称,日期等),则可能会导致代码更易于阅读,并且验证也更容易。但是没有cmd对象的东西应该可以工作,我不认为这是错误的... GSP:
<g:form .......>
<div><g:select name=\"ingredient\" from=\"${[\'Carrots\',\'Celery\',\'Tomato\']}\"><g:textField name=\"amount\"/></div>
<div><g:select name=\"ingredient\" from=\"${[\'Carrots\',\'Celery\',\'Tomato\']}\"><g:textField name=\"amount\"/></div>
<div><g:select name=\"ingredient\" from=\"${[\'Carrots\',\'Celery\',\'Tomato\']}\"><g:textField name=\"amount\"/></div>
<div><g:select name=\"ingredient\" from=\"${[\'Carrots\',\'Celery\',\'Tomato\']}\"><g:textField name=\"amount\"/></div>
</g:form>
控制器:
def saveCart = {
  def shoppingList = [:]
  def ingredients = params.list(\'ingredient\')
  def amounts = params.list(\'amount\')

  ingredients.eachWithIndex() { obj, i ->
     if (shoppingList.containsKey(obj)) {
       shoppingList[obj] = shoppingList[obj] + amounts[i]
     } else {
       shoppingList[obj] = amt[i]
     }
  }

  // shoppingListshould have everything you need now
  ....
  ....
}
    

要回复问题请先登录注册