如果在结构中有数组字段,我该如何转义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?
答案 0 :(得分:2)
您可以通过多种方式实现这一目标:
您可以使用自定义功能。 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上的完整实用示例。
Article
如果可以的话,将Article.BodyHTML
的类型更改为template.HTML
会更容易,然后在没有进一步麻烦的情况下进行转义。这也会使意图明确(它应该/确实包含将被转义为未转义的安全HTML)。
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上尝试此变体。