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

时间:2011-04-22 19:55:20

标签: grails grails-controller

当然,我的第一个Grails项目会出现我的数据模型和UI设计者想要的演示文稿之间的疯狂不匹配。

以下是问题空间的简化说明:

杂货店有三种成分:胡萝卜,芹菜和西红柿。该应用程序的目的是保存用户的购物清单:每个购买的数量。

网页设计师希望通过多个HTML SELECT实现此目的,因此您可以从下拉列表中选择要购买的成分,然后在其旁边键入数量。如果您想要更多成分,请单击添加更多SELECT的JavaScript链接。

设计指定每个下拉列表都相同,并且行数不受限制。所以你可以得到一个有5行的表格,相当于3个胡萝卜,9个芹菜,2个芹菜,5个胡萝卜和1个番茄。

我应该“生产”的是8个胡萝卜,11个芹菜和一个番茄的订单。

没有涉及到为什么这是糟糕的UI设计的所有争论,我想实际上理解如何将模型/控制器映射到给定这种不匹配的视图,既提交又最终编辑存储的提交

我最初的想法是:

  • 对于入站数据,在Controller中构造一个新的映射参数和一些逻辑,将值正确地加到三个新的键/值对中,将新映射传递给bindData方法而不是请求参数映射本身。
  • 为了呈现要编辑的视图,使用afterInterceptor将模型的那一部分重写为正确数量的这些SELECT,并认识到我的原始5行顺序在呈现用于编辑时将变为三行。

但是,当我阅读有关Command对象的内容时,我想知道这是否是一种更好的方法。

我在线阅读了很多页面,但没有看到任何针对此类MVC不匹配的解决方案。

撇开明显的答案(与设计师作斗争),处理此问题的“Grails”方式是什么?

1 个答案:

答案 0 :(得分:0)

我认为你最初的想法应该有效。命令对象可以很好地将构建域对象的逻辑移出控制器方法,但不需要。如果您向shoppingList(名称,日期等)添加更多信息,则可以更容易阅读代码,并且可以更轻松地进行验证。但是没有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
  ....
  ....
}