【问题标题】:What is the "right" way to handle a mismatch between model, controller, and view in Grails?在 Grails 中处理模型、控制器和视图之间不匹配的“正确”方法是什么?
【发布时间】:2011-04-22 19:55:20
【问题描述】:

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

这里是问题空间的简化陈述:

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

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

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

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

没有深入探讨为什么这是糟糕的 UI 设计的所有争论,我想了解,实际上,在这种不匹配的情况下,如何将模型/控制器映射到视图,以提交和最终编辑存储的提交.

我最初的想法是:

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

但是,当我读到 Command 对象时,我想知道这是否是一种更好的方法。

我已经在线阅读了很多页面,但没有看到任何解决这种 MVC 不匹配的方法。

抛开显而易见的答案(与设计者作斗争),“Grails”的处理方式是什么?

【问题讨论】:

    标签: grails grails-controller


    【解决方案1】:

    我认为您最初的想法应该可行。命令对象可以很好地将构建域对象的逻辑移出控制器方法,但不是必需的。如果您将更多信息添加到您的购物清单(姓名、日期等),可能会导致更易于阅读代码和更容易验证。但是没有 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
      ....
      ....
    }
    

    【讨论】:

    • 谢谢!我现在对此感觉好多了。 :-)
    猜你喜欢
    • 2019-06-28
    • 1970-01-01
    • 2013-04-22
    • 2012-06-30
    • 1970-01-01
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多