c.Render() 直接传参并按变量名注入模板上下文,支持小写字段名自动转大写key;c.RenderArgs用于动态键名或复用map,优先级高于c.Render();模板中需确保结构体字段可导出才能访问。

c.Render() 是最直接的传参方式,它把函数参数自动挂到模板上下文,无需手动构造 map。
模板参数怎么从控制器传进去
Revel 的 c.Render() 会把调用时传入的所有参数,按变量名(而非顺序)注入模板上下文。例如:
func (c AppController) Index() revel.Result {
user := User{Name: "Alice", Age: 30}
posts := []Post{{Title: "First"}, {Title: "Second"}}
return c.Render(user, posts)
}
在 views/App/Index.html 中可直接用 {{.user.Name}} 和 {{range .posts}}{{.Title}}{{end}} 访问。
- 参数名是小写开头也没关系,模板里仍用
.user(Revel 自动转首字母大写为 key) - 如果传了同名参数(比如两个
string),后一个会覆盖前一个 - 不支持嵌套结构体字段自动展开,
{{.user.Profile.Avatar}}要求Profile字段可导出且非 nil
c.RenderArgs 手动设值的适用场景
当需要动态键名、运行时计算字段名,或复用已有 map 时,改用 c.RenderArgs:
func (c AppController) Detail() revel.Result {
c.RenderArgs["title"] = "User Profile"
c.RenderArgs["data"] = getUserData()
return c.Render()
}
此时模板中用 {{.title}} 和 {{.data}} 即可。
-
c.RenderArgs是map[string]interface{},可存任意类型 - 若同时调用
c.Render(x, y)和赋值c.RenderArgs,后者优先级更高(会覆盖同名 key) - 注意:
c.Render()内部也会往c.RenderArgs写,所以不要在c.Render()后再改同名 key
模板里访问请求参数和 Flash 数据
Revel 自动注入几个特殊 key 到模板上下文:
-
{{.params}}不可用 —— 实际要用c.Params.Get("key")在控制器里取,再传给c.Render() -
{{.flash}}存 flash 消息,如{{if .flash.success}}{{.flash.success}}{{end}} -
{{.errors}}是Validation.ErrorMap,用于表单校验,如{{with .errors.Title}}{{.Message}}{{end}} -
{{.request}}可访问原始*http.Request,但不推荐在模板里做逻辑判断
真正容易被忽略的是:模板中所有点号访问({{.user.Name}})都依赖 Go 的反射和字段导出规则 —— 如果结构体字段是小写开头,哪怕你手动塞进 c.RenderArgs,模板也读不到。绑定不是字符串匹配,而是结构体字段可见性控制。











