golang模板中的HTML表单提交

时间:2014-09-05 12:20:47

标签: html forms go go-templates

我使用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

2 个答案:

答案 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>