Grails:无法从控制器获取模型数据以查看

时间:2010-09-01 03:55:59

标签: grails grails-controller

过去3周我一直在使用Grails(学习和工作)。我一直在努力将JSP / Servlet应用程序移植到Grails,并且它已经非常“有趣”地移植了应用程序。

我遇到了一个问题,一直在寻找,阅读但尚未解决。

在GSP页面中,我有一个文本字段和搜索按钮,用户可在其中输入ProductID。我有一个控制器,当点击一个搜索按钮时,它从jQuery Ajax方法调用。

 // ----- Part of jQuery Ajax call ---
$.ajax({
        type : "post",
        url : '/${grailsApplication.metadata['app.name']}/product/checkProductAjax',
        data : "pid="+proID,

// ----- Contoller code-----
class ProductController {
      def scaffold = true    
          def checkProductAjax = {
                 def product= Product.findByProductId(params.pid)
                if(product) {
                     [product: product] // model to get data in GSP page.                  
                      render(product.toString() + ":" + product.id)
                } else {
                    render("none")
                }
          }
}

Ajax调用,一切正常。我面临的问题是如何获取模型(即产品数据返回到GSP页面,即[产品:产品]并在GSP中显示,例如产品名称:$ {product}

我怎样才能让它发挥作用?我已经阅读了一些例子,其中提到仅设置模型[product:product]将有助于在GSP中获取数据。

产品名称:$ {product}在GSP页面中始终显示空白产品名称:

请告诉我我做错了什么。

干杯! 杰伊·钱德兰

2 个答案:

答案 0 :(得分:2)

[product: product]render(product.toString() + ":" + product.id)不兼容。当您看到一个控制器操作,其最后一行是像[product: product]这样的映射时,这是隐式返回值,因为它是操作闭包的最后一个语句 - 它相当于return [product: product]。但是如果你在一个方法中间有一张地图,它就会被创建并丢弃。它几乎相当于

def ignoreThisMap = [product: product]
// other code

由于您正在进行Ajax调用,因此将产品放入模型中没有意义,因为您不打算重新呈现GSP。您将要呈现文本,JSON,XML或客户端JavaScript将用于更新某些html子集的其他内容。所以你可能想要更接近的东西

if (product) {
   render product as JSON
}
else {
   render "none"
}

然后您可以使用jQuery或Prototype来评估JSON并在JavaScript中提取数据。

答案 1 :(得分:0)

您可能想要使用为此类工作创建的grails标记;它为您提供了所有AJAX代码

http://www.grails.org/Ajax