Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么是「;对",;在Grails中处理模型、控制器和视图之间不匹配的方法?_Grails_Grails Controller - Fatal编程技术网

什么是「;对",;在Grails中处理模型、控制器和视图之间不匹配的方法?

什么是「;对",;在Grails中处理模型、控制器和视图之间不匹配的方法?,grails,grails-controller,Grails,Grails Controller,当然,我的第一个Grails项目可能会在我的数据模型和UI设计者想要的表示之间出现一个疯狂的不匹配 以下是问题空间的简化说明: 杂货店里有三种配料:胡萝卜、芹菜和西红柿。该应用程序的目的是保存用户的购物清单:每个购物清单要购买多少 web设计师希望通过多个HTML选择来实现这一点,因此您可以从下拉列表中选择要购买的配料,然后在其旁边键入数量。如果你想要更多的成分,你可以点击一个JavaScript链接来添加更多的选择 该设计指定每个下拉列表相同,并且行数不受限制。你可以得到一个有5行的表单,对应

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

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

杂货店里有三种配料:胡萝卜、芹菜和西红柿。该应用程序的目的是保存用户的购物清单:每个购物清单要购买多少

web设计师希望通过多个HTML选择来实现这一点,因此您可以从下拉列表中选择要购买的配料,然后在其旁边键入数量。如果你想要更多的成分,你可以点击一个JavaScript链接来添加更多的选择

该设计指定每个下拉列表相同,并且行数不受限制。你可以得到一个有5行的表单,对应3个胡萝卜,9个芹菜,2个芹菜,5个胡萝卜和1个西红柿

我“应该”从中生产出8个胡萝卜、11个芹菜和一个西红柿

我不想讨论为什么这是一个糟糕的UI设计,我想实际了解,在这种不匹配的情况下,如何将模型/控制器映射到视图,以提交并最终编辑存储的提交

我最初的想法是:

  • 对于入站数据,使用参数和一些逻辑在控制器中构造一个新映射,将值正确地添加到三个新的键/值对中,将新映射传递到bindData方法,而不是请求参数映射本身。
  • 为了显示视图以进行编辑,请使用afterInterceptor将模型的该部分重写为这些选择的正确数目,并认识到当显示视图以进行编辑时,我原来的5行顺序将变为三行。
然而,当我阅读有关命令对象的内容时,我想知道这是否是一种更好的方法

我在网上浏览了很多页面,但没有看到任何解决这种MVC不匹配的方法


撇开显而易见的答案不谈(与设计师抗争),处理这个问题的“Grails”方法是什么?

我认为您最初的想法应该可行。命令对象可以很好地将构建域对象的逻辑移出控制器方法,但不是必需的。如果您在购物清单中添加更多信息(姓名、日期等),则代码更容易阅读,验证也更容易。但是没有cmd对象的东西应该可以工作,我不认为这是错误的

普惠制:


非常感谢。我现在感觉好多了。:-)
<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
  ....
  ....
}