Grails: невозможно получить данные модели из контроллера для просмотра - PullRequest
0 голосов
/ 01 сентября 2010

Я использую Grails последние 3 недели (учусь и работаю). Я работал над переносом приложения 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 ]

2 голосов
/ 01 сентября 2010

[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.

0 голосов
/ 01 сентября 2010

вы, вероятно, хотите использовать теги grails, созданные для этого типа работы;он включает в себя код AJAX для вас

http://www.grails.org/Ajax

...