在struct中的数组字段中转义HTML

时间:2015-04-20 07:18:03

标签: arrays go struct escaping go-templates

如果在结构中有数组字段,我该如何转义HTML?

对于单个节目页面,此代码有效:

show.go:

err := ShowTmpl.ExecuteTemplate(w, "show.html", struct {
        Title    string
        SafeBody template.HTML
}{
    t.Title,
    template.HTML(t.BodyHTML),
})

索引页面:

index.go

type as struct {
        Articles []*Article
    }
var a as

// some code to give a.Articles its values

err := IndexTmpl.ExecuteTemplate(w, "index.html", a)
if err != nil {
    http.Error(w, err.Error(), http.StatusInternalServerError)
}

的index.html:

{{with .Articles}}
  {{range .}}
    <a href="/">{{.Title}}</a>
    {{.BodyHTML | html}} // Doesn't work
  {{end}}
{{end}}

当我在结构域上进行测距时,如何逃避HTML?

1 个答案:

答案 0 :(得分:2)

您可以通过多种方式实现这一目标:

1。使用自定义功能

您可以使用自定义功能。 Template.Funcs()方法允许您注册可以从模板调用的任何自定义函数。

创建一个简单的函数,将string转换为template.HTML,如下所示:

func ToHtml(s string) template.HTML {
    return template.HTML(s)
}

你可以这样注册:

t := template.Must(template.New("index.html").
    Funcs(map[string]interface{}{"ToHtml": ToHtml}).Parse(indexHtml))

仅用于演示目的indexHtml是模板的string

const indexHtml = `{{with .}}
  {{range .}}
    <a href="/">{{.Title}}</a>
    {{ToHtml .BodyHTML}}
  {{end}}
{{end}}
`

你可以参考它并从模板中调用它:

{{ToHtml .BodyHTML}}

使用参数调用此模板:

a := []struct {
    Title    string
    BodyHTML string
}{{"I'm the title", "I'm some <b>HTML</b> code!"}}

err := t.ExecuteTemplate(os.Stdout, "index.html", a)

以下是Go Playground上的完整实用示例。

2。修改Article

如果可以的话,将Article.BodyHTML的类型更改为template.HTML会更容易,然后在没有进一步麻烦的情况下进行转义。这也会使意图明确(它应该/确实包含将被转义为未转义的安全HTML)。

3。将方法添加到Article

您还可以向Article类型添加一个方法,该方法会将BodyHTML字段作为template.HTML返回(几乎是自定义函数在命题#1中的作用):

func (a *Article) SafeBody() template.HTML {
    return template.HTML(a.BodyHTML)
}

使用此方法,您只需从模板中调用它:

  {{range .}}
    <a href="/">{{.Title}}</a>
    {{.SafeBody}}
  {{end}}

Go Playground上尝试此变体。