2014-09-05 5 views
2

Я использую язык go для отправки HTML-формы с использованием шаблона go. Получение некоторых странных результатов.Форма HTML-формы в шаблоне golang

Основная идея заключается в том, что у меня есть структура данных, называемая страницей, содержащая несколько элементов. Шаблон заполняется массивом Pages. Внутри шаблона я повторяю каждую страницу и отображаю ее содержимое. Каждое из этих содержимого встроено в HTML-форму с соответствующей ссылкой. Как только ссылка будет нажата, она представит соответствующую форму.

фрагмент кода выглядит следующим образом:

{{range $index, $element := .Pages}}                    
    <form action="/detailNews" id="readMore{{$index}}" method="post" name="readMore{{$index}}"> 
    //displaying elements from each page      

    <div id="more"> 
     <input name="query" type="hidden" value="{{printf "%s" .Title}}">       
     <a href="#" onclick="document.readMore{{$index}}.submit()">Read More</a> 
    </div> 

    </form> 
{{end}} 

Код в основном работает с одной небольшой проблемой. Атрибуты идентификатора и имени генерируют выходные сигналы, как и ожидалось, такие как: readMore0, readMore1 и т.д.

Проблема заключается в «» метки, где атрибут OnClick заполняется с этим: document.readMore 0 .submit(), document.readMore 1 .submit() и т. д. Обратите внимание на пространство, окружающее 0, 1. При этом соответствующая форма не будет найдена при нажатии ссылки.

Я не могу понять причину этого.

Любая помощь будет высоко оценена.

Спасибо, Ripul

ответ

3

У вас есть рабочий пример для воспроизведения? Я пытался на месте, и он работает, как ожидалось:

http://play.golang.org/p/ZnM0RqIMfL

package main 

import (
     "os" 
     "text/template" 
) 

type Page struct { 
     Title string 
} 

func main() { 
     template.Must(template.New("test").Parse(` 
{{range $index, $element := .Pages}} 
    <form action="/detailNews" id="readMore{{$index}}" method="post" name="readMore{{$index}}"> 
    //displaying elements from each page 

    <div id="more"> 
     <input name="query" type="hidden" value="{{printf "%s" .Title}}"> 
     <a href="#" onclick="document.readMore{{$index}}.submit()">Read More</a> 
    </div> 

    </form> 
{{end}} 
`)).Execute(os.Stdout, struct{ Pages []Page }{Pages: []Page{ 
       {Title: "page1"}, {Title: "page2"}, 
     }}) 
} 

Результат:

<form action="/detailNews" id="readMore0" method="post" name="readMore0"> 
    //displaying elements from each page 

    <div id="more"> 
     <input name="query" type="hidden" value="page1"> 
     <a href="#" onclick="document.readMore0.submit()">Read More</a> 
    </div> 

    </form> 

    <form action="/detailNews" id="readMore1" method="post" name="readMore1"> 
    //displaying elements from each page 

    <div id="more"> 
     <input name="query" type="hidden" value="page2"> 
     <a href="#" onclick="document.readMore1.submit()">Read More</a> 
    </div> 

    </form> 
+0

Разница между вашим и моим была в том, что я использовал html/template, и вы использовали пакет text/template. Я изменил его на текст/шаблон и, похоже, работает! Мне нужно понять разницу между шаблоном html и текстовым пакетом. Большое спасибо за это. – Ripul

6

Это происходит из-за escaping contexts.

По умолчанию этот пакет предполагает, что все конвейеры образуют обычную текстовую строку . Он добавляет избегающие стадии конвейера, необходимые для правильного , и безопасно вставлять эту текстовую строку в соответствующий контекст.

Если значение данных не является обычным текстом, вы можете убедиться, что это не с избыточным экранированием, пометив его своим типом.

Типы HTML, JS, URL и другие данные из content.go могут содержать безопасный контент , который освобождается от экранирования.

Для того, чтобы преодолеть его, вы должны пройти индексную страницу, как часть .Pages элементов типизированных структур, как template.JS. Что-то вроде этого:

type Page struct { 
     Id template.JS 
     Title string 
} 
+1

Привет Emil, большое спасибо за Ваш ответ. Позвольте мне попробовать. Однако у меня есть один вопрос. Почему это влияет только на атрибут onclick? Например, только для эксперимента, когда я переместил 'document.readMore {{$ index}}.submit() 'to href, он производит правильный вывод. Есть идеи? Благодарю. – Ripul

+0

@Ripul Это контекстно известно, поэтому он обнаруживает, где вы размещаете переменную HTML, JS и т. Д., И «добавляет экранирующие стадии конвейера, необходимые для правильной и безопасной вставки этой простой текстовой строки». Таким образом, экранирование отличается для разных контекстов. –

 Смежные вопросы

  • Нет связанных вопросов^_^