Grails: невозможно получить данные модели от контроллера для просмотра

Я использую 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. Название продукта:

Подскажите пожалуйста, что я делаю не так.

Ваше здоровье! Джей Чандран


person Jay Chandran    schedule 01.09.2010    source источник


Ответы (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.

person Burt Beckwith    schedule 01.09.2010
comment
Привет, спасибо за подсказку. Я должен был подумать об этом. :) Теперь я визуализирую продукт как JSON и на странице с помощью jQuery получаю требуемые значения! Большое спасибо... :) - person Jay Chandran; 01.09.2010

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

http://www.grails.org/Ajax

person Aaron Saunders    schedule 01.09.2010