模板文件内的Golang重定向功能失败

模板文件内的Golang重定向功能失败,go,Go,正如golang文档所述,模板函数必须至少有一个返回参数,因此我想我已经可以排除模板函数了 所以我想我可以直接在内容模型上创建函数,但我想不行 我认为下面的标记是根文件夹中非常自我解释的index.tmpl文件: {{$request := .Request}} {{$response := .Response}} {{if eq $request.Method "POST"}} {{.Redirect "page1" 301}} {{end}} <!DOCTYPE html&g

正如golang文档所述,模板函数必须至少有一个返回参数,因此我想我已经可以排除模板函数了

所以我想我可以直接在内容模型上创建函数,但我想不行

我认为下面的标记是根文件夹中非常自我解释的index.tmpl文件:

{{$request := .Request}}
{{$response := .Response}}
{{if eq $request.Method "POST"}}
    {{.Redirect "page1" 301}}
{{end}}

<!DOCTYPE html>
<html>
  <head>
    <title>{{.Title | title}}</title>
  </head>
  <body>
    <h1>{{.Title}}</h1>
    {{.Body}}
    <p>{{.ContentType}}</p>
    <p>{{$request}}</p>
    <p>{{lol}}</p>
    <form method="POST">
        <input type="text" name="lolcat"/>
        <input type="submit" value="submit"/>
    </form>
  </body>
</html>
我做错了什么,如何做到这一点-

解决方案:


感谢Ainar-G

这样的逻辑应该进入处理程序。模板仅用于显示数据。它们的设计目的不再是什么。任何关于呈现内容和方式的决策都应该在处理程序代码中完成

考虑到这一点,以下是如何做到这一点:


您不能直接写入w,因为这将导致它将响应代码设置为200。您还应该在包装器中注册重定向函数,因为所有模板函数都必须返回一个或两个错误值。同样,仅仅因为您可以,并不意味着您应该这样做。

这样的逻辑应该进入处理程序。模板仅用于显示数据。它们的设计目的不再是什么。任何关于呈现内容和方式的决策都应该在处理程序代码中完成

考虑到这一点,以下是如何做到这一点:


您不能直接写入w,因为这将导致它将响应代码设置为200。您还应该在包装器中注册重定向函数,因为所有模板函数都必须返回一个或两个错误值。再说一次,仅仅因为你可以,并不意味着你应该这样做。

我很清楚这一点,但我的应用程序不是固定的。这是一个CMS,需要尽可能灵活和易于定制。我知道这不是一个理想的方法,但有时候这是值得的。当然,我一直在想,我可能需要在处理程序中实现这一点,但实际上,对于我的具体情况来说,这是最好的方法。这就是为什么我没有问这是否是最好的方法,而是如何使之成为可能。我想如果不是这样的话,我别无选择,只能为劫机处理人员建立管道。但无论如何还是要感谢你的回答。好奇心控制了我,我决定检查一下它是否真的有效。是的。如果您仍然认为这是一个好的解决方案,我添加了可以工作的代码。你怎么知道的?由于ASP.NETRazor是在视图中用c实现这一功能的,所以在某些情况下,这样做是否合理?我的应用程序是一个CMS,有很多动态添加的模板,直接或通过插件。这真的是一种糟糕的做法吗?或者,为了灵活性和可定制性,这样做有意义吗?创建并注入处理程序并非不可能。。使用io.Copy时,性能是否会受到很大影响?通过尝试和仔细阅读。性能可能不是问题。我对这件事很谨慎,因为我的朋友。路由规则应该在路由配置中,而不是分散在视图中,不是吗?向模板添加更多函数最终会使它们变成一种糟糕的脚本语言。如果您确实需要脚本语言,为什么不直接使用Lua呢?我很清楚这一点,但我的应用程序不是固定的。这是一个CMS,需要尽可能灵活和易于定制。我知道这不是一个理想的方法,但有时候这是值得的。当然,我一直在想,我可能需要在处理程序中实现这一点,但实际上,对于我的具体情况来说,这是最好的方法。这就是为什么我没有问这是否是最好的方法,而是如何使之成为可能。我想如果不是这样的话,我别无选择,只能为劫机处理人员建立管道。但无论如何还是要感谢你的回答。好奇心控制了我,我决定检查一下它是否真的有效。是的。如果您仍然认为这是一个好的解决方案,我添加了可以工作的代码。你怎么知道的?由于ASP.NETRazor是在视图中用c实现这一功能的,所以在某些情况下,这样做是否合理?我的应用程序是一个CMS,有很多动态添加的模板,直接或通过插件。这真的是一种糟糕的做法吗?或者,为了灵活性和可定制性,这样做有意义吗?创建并注入处理程序并非不可能。。使用io.Copy时,性能是否会受到很大影响?通过尝试和仔细阅读。性能可能不是问题。我对这件事很谨慎,因为我的朋友。路由规则应该在路由配置中,而不是分散在视图中,不是吗?向模板添加更多函数最终会使它们变成一种糟糕的脚本语言。如果您确实需要脚本语言,为什么不直接使用Lua呢?
main.go
index.tmpl
page1.tmpl (just use the same as index.tmpl)