首页 > 解决方案 > 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= 字段中,你会沿着文件树往上走。是的,我知道这一点,我会尝试解决这个问题。如果您对如何解决该问题有任何建议,也可以告诉我:)

标签: htmlgo

解决方案


{{range .Items}}匹配之后{{end}},模板运行时将上下文设置为循环变量,即Item. AnItem没有父母。您可以使用 $: use{{$.Parent}}来访问全局上下文。


推荐阅读