我使用go语言使用go-template提交HTML表单。得到一些奇怪的结果。
基本思想是我有一个名为Page的数据结构,其中包含一些元素。模板中填充了一系列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}}
代码主要适用于一个小问题。 id和name属性按预期生成输出,例如: readMore0 , readMore1 等。
问题出现在“a”标签上,其中onclick属性填充为: document.readMore 0 .submit(), document.readMore 1 .submit()等。请注意0,1附近的空格。这样,单击链接时找不到相应的表单。
我无法弄清楚原因。
任何帮助都将受到高度赞赏。
谢谢, Ripul
答案 0 :(得分:6)
这是因为escaping contexts而发生的。
默认情况下,此程序包假定所有管道都生成plain 文字字符串。它增加了正确的逃逸管道阶段 并安全地将该纯文本字符串嵌入适当的上下文中。
如果数据值不是纯文本,则可以确保不是 通过标记它的类型来过度逃避。
来自content.go的HTML,JS,URL和其他类型可以携带安全内容 这是免于逃避。
为了克服它,您应该将页面索引作为.Pages
元素结构的一部分传递为template.JS
。像这样:
type Page struct {
Id template.JS
Title string
}
答案 1 :(得分: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>