golang模板中的HTML表单提交

Rip*_*pul 2 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}}
Run Code Online (Sandbox Code Playgroud)

代码主要适用于一个小问题.id和name属性按预期生成输出,例如:readMore0,readMore1等.

问题出现在"a"标签上,其中onclick属性填充为:document.readMore 0 .submit(),document.readMore 1 .submit()等.注意0,1附近的空间.这样,单击链接时未找到相应的表单.

我无法弄清楚这个的原因.

任何帮助将受到高度赞赏.

谢谢,Ripul

Emi*_*yan 6

这是因为逃避上下文而发生的.

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

如果数据值不是纯文本,则可以通过使用其类型标记数据值来确保它不会过度转义.

来自content.go的HTML,JS,URL和其他类型可以携带免于转义的安全内容.

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

type Page struct {
         Id    template.JS
         Title string
}
Run Code Online (Sandbox Code Playgroud)