在golang模板中提交HTML表单

在golang模板中提交HTML表单,html,forms,go,go-templates,Html,Forms,Go,Go Templates,我正在使用go语言使用go模板提交HTML表单。得到一些奇怪的结果 基本思想是,我有一个名为Page的数据结构,其中包含一些元素。该模板由页面数组填充。在模板内部,我遍历每个页面并显示其内容。这些内容中的每一个都嵌入到HTML表单中,并带有各自的链接。单击链接后,它将提交相应的表单 代码片段如下所示: {{range $index, $element := .Pages}}

我正在使用go语言使用go模板提交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}}
{{range$index,$element:=.Pages}
//显示每个页面中的元素
{{end}
代码主要处理一个小问题。id和name属性按预期生成输出,例如:readMore0readMore1

问题出在onclick属性填充的“a”标记处:document.readMore 0.submit()document.readMore 1.submit(),等等。请注意0,1周围的空格。这样,在单击链接时就找不到相应的表单

我想不出这是什么原因

我们将非常感谢您的帮助

谢谢,
Ripul

这是因为

默认情况下,此包假定所有管道都生成一个平面 文本字符串。它添加了正确执行所需的转义管道阶段 并将该纯文本字符串安全地嵌入到适当的上下文中

当数据值不是纯文本时,可以确保它不是纯文本 通过在其上标记其类型,使其溢出

从content.go中键入HTML、JS、URL和其他内容可以携带安全内容 那是免于逃跑的

为了克服它,您应该将页面索引作为键入为的
.Pages
元素结构的一部分传递。大概是这样的:

type Page struct {
         Id    template.JS
         Title string
}

您是否有一个可复制的工作示例?我在本地进行了尝试,效果如预期:

主程序包
进口(
“操作系统”
“文本/模板”
)
类型页结构{
标题字符串
}
func main(){
template.Must(template.New(“test”).Parse(`
{{range$index,$element:=.Pages}
//显示每个页面中的元素
{{end}
`)).Execute(os.Stdout,结构{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>

//显示每个页面中的元素
//显示每个页面中的元素

你好,Emil,非常感谢您的回复。让我试试这个。不过,我有一个问题。为什么这只在onclick属性中受影响?例如,为了进行实验,当我将
document.readMore{{{$index}}.submit()移动到href属性时,它会生成正确的输出。有什么想法吗?谢谢。@Ripul它是上下文感知的,因此它可以检测变量HTML、JS等的放置位置,并“添加正确、安全地嵌入该纯文本字符串所需的转义管道阶段”。所以转义在不同的上下文中是不同的。你和我的不同之处在于我使用html/模板,而你使用文本/模板包。我把它改为文本/模板,它似乎工作!我需要理解html模板和文本包之间的区别。非常感谢。
 <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>