模板渲染必须用 ctx.View,它依赖 ctx.ViewData 数据且不可与 ctx.JSON 混用;ViewData 是请求级 map,需直接赋值且键名大小写敏感;MVC 中推荐返回 mvc.View 结果或嵌入 *iris.Context 调用;layout 需显式设置并配合 {{define "content"}} 和 {{template "content" .}} 使用。

模板渲染必须用 ctx.View,不是 ctx.JSON 或 ctx.Text
在 MVC 模式下,Iris 不允许你在同一个 handler 里混用 ctx.View 和 ctx.JSON —— 一旦调用了 ctx.JSON,响应体就被标记为 JSON 类型,后续再调用 ctx.View 会静默失败或返回空内容。这是最容易踩的坑:你写了 ctx.ViewData["title"] = "首页",也调了 ctx.View("index.html"),但页面一片空白,很可能前面某处误调了 ctx.JSON 或其他写响应的函数。
-
ctx.View是唯一触发 HTML 模板渲染的入口,它依赖ctx.ViewData中的数据 -
ctx.JSON、ctx.Text、ctx.StatusCode等会提前结束响应流程,阻断模板执行 - MVC controller 方法返回
string或error时,Iris 默认不自动渲染模板,必须显式调用ctx.View
ViewData 是请求级 map,不能靠 ctx.Set 或全局变量传值
很多人习惯用 ctx.Set("title", "首页") 想把值塞进模板,结果渲染时全是空——ctx.Set 是给中间件或后续 handler 用的,跟模板引擎完全无关。Iris 的 HTML 模板(html/template 或 jet)只读取 ctx.ViewData 这个 map[string]interface{}。
- 必须在 handler 内直接赋值:
ctx.ViewData["Title"] = "首页"(注意键名大小写敏感) - struct 字段要首字母大写才能被模板访问,比如
type Page { Title string }可以,title string不行 - 不要在 controller 外部初始化
ViewData,它由 Iris 在每次请求时自动创建并清空
MVC controller 中怎么正确调用 ctx.View
在基于 iris/mvc 的 controller 里,ctx 并不直接暴露在方法签名中,你需要从 controller 结构体字段获取,或者用 mvc.Result 返回值方式绕过手动调用。
- 推荐方式:在 controller struct 中嵌入
*iris.Context字段,如Ctx *iris.Context,然后在方法里用c.Ctx.View("index.html") - 更干净的方式:让方法返回
mvc.Result,例如return mvc.View{"index.html", map[string]interface{}{"Title": "首页"}},Iris 会自动处理ViewData注入和View调用 - 别忘了提前注册模板目录:
app.RegisterView(iris.HTML("./web/views", ".html")),路径必须是相对main.go的,不是相对 controller 文件
复用 layout 需要提前设置 ctx.ViewLayout 并用 {{template "content" .}}
如果你用了公共 layout(比如 layouts/main.html),光靠 ctx.View("pages/index.html") 不会自动套进去——Iris 不会默认解析嵌套模板,必须显式声明 layout,并在子模板里用标准 Go template 语法引用 content 区域。
- 在 handler 开头调用:
ctx.ViewLayout("layouts/main.html") - layout 文件里必须包含:
{{template "content" .}},否则子模板内容不会被插入 - 子模板(如
pages/index.html)开头需声明:{{define "content"}}...{{end}},否则会被忽略 - layout 路径和子模板路径都按
RegisterView时指定的根目录计算,不支持跨目录通配
ctx.View 是否真被执行了。


















