过去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页面中始终显示空白产品名称:
请告诉我我做错了什么。
干杯! 杰伊·钱德兰
答案 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代码