2

我正在使用 go 语言使用 go-template 提交 HTML 表单。得到一些奇怪的结果。

基本思想是我有一个名为 Page 的数据结构,其中包含一些元素。该模板填充了一组页面。在模板中,我遍历每个页面并显示其内容。这些内容中的每一个都嵌入在带有相应链接的 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 属性按预期生成输出,例如:readMore0readMore1等。

问题出在 onclick 属性填充的“a”标签上:document.readMore 0 .submit()document.readMore 1 .submit()等。注意 0、1 周围的空格。有了这个,单击链接时未找到相应的表单。

我无法弄清楚这是什么原因。

任何帮助将不胜感激。

谢谢, 里普尔

4

2 回答 2

6

这是因为转义上下文而发生的。

默认情况下,此包假定所有管道都生成纯文本字符串。它添加了在适当的上下文中正确和安全地嵌入纯文本字符串所必需的转义管道阶段。

当数据值不是纯文本时,您可以通过用它的类型标记它来确保它没有被过度转义。

content.go 中的 HTML、JS、URL 等类型可以携带免于转义的安全内容。

为了克服它,您应该将页面索引作为.Pages类型为的元素结构的一部分传递template.JS。像这样的东西:

type Page struct {
         Id    template.JS
         Title string
}
于 2014-09-05T13:18:11.890 回答
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>
于 2014-09-05T13:38:47.600 回答