Grails:从另一个控制器更新 Index.gsp

Grails : Updating Index.gsp from another controller

我的 Grails 应用程序使用的是版本 2.3.6

在这个应用程序中有一个控制器 class:

class UserOrderController {

def index(Integer max) {
        params.max = Math.min(max ?: 20, 100)       
        respond UserOrder.list(params), model:[userOrderInstanceCount: WorkOrder.count()]
    }
}

现在在另一个控制器中,我正在访问 UserOrder 对象并根据产品 ID 进行过滤。产品 ID 是 UserOrder 域 class.

中的字符串 属性

另一个控制器是:

class UserOrderFilterController {

def getUOBasedOnID () {

  // Here i get a new list for **UserOrder**
  // Now i want to draw the UserOrderController page with the new list
}
}

我是 Grails 的新手,不知道该怎么做。

我应该在 UserOrderController class 中创建一个新的 INDEX 函数并传递新列表吗?

如下图:

class UserOrderController {

def index(Integer max) {
        params.max = Math.min(max ?: 20, 100)       
        respond UserOrder.list(params), model:[userOrderInstanceCount: userOrder.count()]
    }

 def index(List UserOrder) {

   // create page???
}

}

更新:

UserOrderFilterController 有自己的 index.gsp 文件。 我正在做的是:访问 UserOrder 域 class 的所有对象并根据 属性.

过滤它们

现在,在 UserOrderFilterController 的 index.gsp 中,我将显示找到的 objects/orders 的总数。此号码将显示为使用 href 的超链接,当用户单击它时,它将转到 index.gsp 页面 UserOrderController,仅显示过滤后的 UserOder

所以我期待的是:

<a href='${createLink(controller:'UserOrder', action:'index')}'>%s</a>

A href 如上所示,带有 params 字段,该字段将包含 UserOrder[=54 的过滤列表=]的。

我不知道如何将 params/list 添加到 href。这可能吗?

Grails 中的每个 action 都有一个匹配的 view。重复操作是自找麻烦。如果您有一些 功能值得单独放置一个页面,那么您应该创建一个新操作和一个新视图。

如果属于在主页上,则通过相同的index方法将其放入。

请注意,在 grails 中,您只需将值传递给 .gsp 页面,而 .gsp 页面负责处理数据的格式设置。您的 action 对视图结构的了解绝对为 0。这是MVC中的一个核心概念。

在这种情况下,您可以根据 the docs 重定向到控制器。您最感兴趣的是:

redirect(controller: "yourController", action:"index", params=[filteredList: filteredList]);

这将重定向到您的 UserOrderController 中的现有索引操作,并传入过滤后的列表。从那里,你可以有类似的东西..

if(params.filteredList) {
    // You know this came from the filtered controller, so display this and don't
    // make a DB call.
}

注意事项

  • 你的 grails 应用程序的结构让我很担心。为什么你有一个完全独立的控制器来简单地过滤数据?

编辑

采用 createLink 方法可以稍微改进一下。而不是..

<a href='${createLink(controller:'UserOrder', action:'index')}'>%s</a>

您可以使用 g:link 功能:

<g:link controller="UserOrder" action="index" params=['filteredList':filteredList]>%s</g:link>

如果您尝试为过滤器 UserOrderFilterController 创建新的控制器,您可以

class UserOrderFilterController {

def getUOBasedOnID () {

  //get filtered list
    respond filteredList, [view:'userOrder/index',model:[userOrderInstanceCount: filteredListCount]]
  }
}

您可以查看有关回复的更多信息here