html - golang http模板变量不起作用
问题描述
我正在尝试在 Go 中使用 http 模板来呈现列表中网页上特定文件夹中的所有文件。每个文件或文件夹也应该链接到它各自的路径。我已经阅读了文件夹中的所有项目并将它们保存到这些结构中
type Item struct {
Name string
IsFolder bool
Info os.FileInfo
}
// Items contains a slice of all items in a folder
type Items struct {
Parent string
Items []Item
}
然后将其传递给 template.ExecuteTemplate 函数。有问题的模板如下所示:
<html>
<head>
<title>website</title>
</head>
<body>
<h1>Welcome to my website</h1>
<p>Files in {{.Parent}}</p>
<ul>
<li><a href="ftp?f={{ .Parent }}">{{.Parent}}</a></li>
{{range .Items}} {{if .IsFolder}}
<li><a href="ftp?f={{ .Parent }}/{{ .Name }}">{{ .Name }}</a></li>
{{else}}
<li><a href="ftp?f={{ .Parent }}/{{ .Name }}">{{.Name}}</a></li>
{{end}} {{end}}
</ul>
</body>
</html>
然而,我的问题是,在加载页面时,唯一返回的是开始直到
<li><a href="ftp?f={{ .Parent }}/{{ .Name }}">{{ .Name }}</a></li>
它在 ?f= 之后立即停止,我之前只使用 {{ .Name }} 对其进行了测试,并且效果非常好,当然,除了链接不会去任何地方。在上面的列表位置渲染 {{ .Parent }} 绝对可以。如果我只是删除 /,它也不起作用,这会产生完全相同的问题。
当然,我的问题是为什么会发生这种情况以及我将如何解决它。
附言。你可能会注意到一个小的安全漏洞,如果你把 ../ 放在 ftp?f= 字段中,你会沿着文件树往上走。是的,我知道这一点,我会尝试解决这个问题。如果您对如何解决该问题有任何建议,也可以告诉我:)
解决方案
在{{range .Items}}
匹配之后{{end}}
,模板运行时将上下文设置为循环变量,即Item
. AnItem
没有父母。您可以使用 $: use{{$.Parent}}
来访问全局上下文。