0

过去 3 周我一直在使用 Grails(学习和工作)。我一直致力于将 JSP/Servlet 应用程序移植到 Grails,并且移植应用程序绝对“有趣”。

我遇到了一个问题,一直在搜索、阅读,但还没有解决。

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

// ----- jQuery Ajax 调用的一部分 ---
$.ajax({
        类型:“帖子”,
        url : '/${grailsApplication.metadata['app.name']}/product/checkProductAjax',
        数据:“pid="+proID,

// ----- 控制器代码-----
类产品控制器 {
      def 脚手架 = 真    
          def checkProductAjax = {
                 def product= Product.findByProductId(params.pid)
                如果(产品){
                     [product: product] // 获取 GSP 页面数据的模型。                  
                      渲染(product.toString() + ":" + product.id)
                } 别的 {
                    渲染(“无”)
                }
          }
}

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

我怎样才能让它工作?我已阅读示例,其中提到仅设置模型 [产品:产品] 将有助于获取 GSP 中的数据。

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

请告诉我我做错了什么。

干杯! 杰伊·钱德兰

4

2 回答 2

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 中提取数据。

于 2010-09-01T05:32:57.327 回答
0

您可能希望使用为此类工作创建的 grails 标签;它为您包装了所有 AJAX 代码

http://www.grails.org/Ajax

于 2010-09-01T04:14:15.587 回答