Вопрос

В моем контроллере Grails я отвечаю на вызов AJAX и использую render чтобы вернуть текст:

def ajaxRandomPersonName = {
    def person = get a random person ...
    render "Name: ${person.name}"
}

Проблема в том, что render отображает весь шаблон.Поэтому вместо простого рендеринга «Имя:John», он отображает все значки, навигацию и т. д., определенные в шаблоне.Как я могу получить render просто визуализировать без шаблона?

Я в значительной степени следую главе 1 книги «Grails в действии» (стр. 28), используя Grails 1.1.1.

Следовать за:Возврат false по предложению Рисингсана не имеет никакого эффекта.Я также попытался установить для шаблона значение null, но он все равно отображает шаблон:

def ajaxRandomPersonName = {
    def person = get a random person ...
    render (template:null, text:"Name: ${person.name}")
}

render его сердце стремится отобразить его через шаблон, что бы я ни делал.

Продолжить 2: Параллельное обсуждение в списке рассылки пользователей Grails.

Продолжить 3:Образец кода:Я сократил свой код до минимума, и он по-прежнему демонстрирует нежелательный рендеринг шаблонов.

контроллеры/PersonController.groovy:

class PersonController { 
    def index = { } 
    def home = { [message:"Hello"] } 

    def ajaxTest = { 
        println "ajaxTest called" 
        render text: "ajax message" 
    } 
} 

views/person/home.gsp (страница просмотра для домашнего метода)

<html> 
<head> 
    <title>Home View</title> 
    <g:javascript library="prototype" /> 
</head> 
<body> 
    <p> 
        <g:remoteLink action="ajaxTest" update="test1">ajax call</g:remoteLink> 
    </p> 
    <p>Message = ${message}</p> 
    <p id="test1">Blank</p> 
</body> 
</html> 

views/layouts/person.gsp (шаблон макета для персонального контроллера)

<html> 
<head> 
    <title>Test App - <g:layoutTitle/></title> 
    <g:layoutHead/> 
</head> 
<body> 
    <h1>Test App</h1> 
    <g:layoutBody/> 
</body> 
</html> 

Я получаю доступ к контроллеру человека с домашним видом:http://localhost:8080/test/person/home

страница отображается как:Тестовое приложение Ajax Call (Hyperlink) Сообщение = Hello Blank

«Тестовое приложение» взято из шаблона.Когда я нажимаю «вызов ajax», он выполняет асинхронный вызов метода ajaxTest PersonController (проверено с помощью println).Все, что делает ajaxTest, — это печатает ln и отображает статический текст.Это привело к следующему:

Test App 
ajax call 
Message = Hello 
Test App 
ajax message 

Обратите внимание, что шаблон отображается в «test1». <p> в результате чего появляется второе «Тестовое приложение».

Я использую Grails 1.1.1.Есть идеи?Код кажется простым.Я скачал исходный код Grails и посмотрел RenderDynamicMethod.java.Он не выполняет рендеринг шаблона, если шаблон не находится в списке аргументов, а это не так.Так что я могу только предположить, что что-то происходит с повторной отрисовкой шаблона.

Это было полезно?

Решение

Решено:Добавление contentType приводит к тому, что шаблон не отображается:

render text: "Name: ${person.name}", contentType: "text/plain"

Другие советы

Сделайте так, чтобы ваш javascript-код на стороне клиента обрабатывал ответ JSON и визуализировал ваш ответ с помощью:

рендеринг [текст:"Имя:$ {person.name} "] как json

Возможно, вас обожгла функция «макет по соглашению» в Grails.Например, если имя вашего макета соответствует префиксу имени контроллера, Grails применит макет к каждому представлению, управляемому этим контроллером.К сожалению, это касается даже текста и шаблонов.В настоящее время по этому поводу зарегистрировано несколько JIRA (см. http://jira.grails.org/browse/GRAILS-7624 например).Я обжегся этим сегодня.Я решил эту проблему, просто переименовав свой макет gsp так, чтобы он не соответствовал ни одному имени контроллера.Мой макет изначально назывался «storefront.gsp», и у меня есть контроллер с именем StorefrontController.Я переименовал макет в public.gsp.

Мы обнаружили, что явный возврат false из действия исправляет эту проблему.

Я считаю, что делаю render foo, поскольку JSON неявно возвращает false.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top