Beego模板中JS变量需JSON序列化——控制器用json.Marshal转义后传入模板,模板中直接{{.xxx}}不加引号;否则HTML转义或fmt.Sprint导致JS解析失败或显示[object Object]。

Beego 模板里直接把 Go 变量塞进 JavaScript 代码,不加处理会出错——不是 JS 语法错误,就是引号被转义成 ",或者数组变成 [object Object]。根本原因是 Beego 用的是 Go 标准库的 html/template,所有 {{.xxx}} 插值默认 HTML 转义,而 JS 引擎不吃这一套。
Beego 模板中写 JS 变量时引号被转义(如 ")
这是最常见现象:你在控制器里设了 c.Data["title"] = "Hello \"World\"",模板里写 var title = "{{.title}}";,浏览器实际拿到的是 var title = "Hello "World"";,JS 解析失败。
- 别用双引号包裹模板插值,改用单引号 + JSON 编码:用
var title = '{{.title}}';只能解决简单字符串,遇到换行、单引号还是会崩 - 真正安全的做法是提前在控制器中用
json.Marshal序列化,再传给模板:c.Data["titleJSON"] = string(b)(其中b, _ := json.Marshal(title)) - 模板里直接写:
var title = {{.titleJSON}};—— 注意这里没加引号,因为json.Marshal输出的是带双引号的合法 JSON 字符串
Beego 模板中传递结构体或数组到 JS 时显示 [object Object]
你写了 c.Data["user"] = User{Name: "Alice", Age: 30},模板里 var user = {{.user}};,结果 JS 里 user 是 [object Object]。这不是 Beego 的 bug,而是 Go 模板对结构体默认调用 fmt.Sprint,输出的是调试字符串,不是 JSON。
- 必须手动序列化:在控制器中做
data, _ := json.Marshal(user),然后c.Data["userJSON"] = string(data) - 如果字段含 HTML 敏感字符(比如
<script></script>),json.Marshal会自动转义为 <code>\u003c,这是安全的,不用额外处理 - 模板中仍用无引号写法:
var user = {{.userJSON}};,这样 JS 才能正确解析为对象
Beego 中使用 >> 语法报错或不生效
这个语法来自 Beego 的自定义模板分隔符配置(beego.TemplateLeft = "),但它本身**不支持 <code>json 函数调用**。你写 >>,模板引擎会直接报错“function not defined”。
立即学习“Java免费学习笔记(深入)”;
- Beego 默认模板函数里没有
json,它只内置了date、html等几个基础函数 - 要么在控制器里全部预序列化好,像上面说的那样传
userJSON、boxesJSON - 要么自己注册一个模板函数:
beego.AddFuncMap("json", func(v interface{}) string { b, _ := json.Marshal(v); return string(b) }),之后才能用{{json .boxes}} - 注意:自定义函数返回的是字符串,模板里仍要写成
var boxes = {{json .boxes}};,不能加引号
最容易被忽略的一点:JS 变量注入必须发生在 <script></script> 标签内且位置靠前,不能放在 ng-init 或 $(document).ready 里再取——因为那些是运行时执行,而模板插值是服务端一次性渲染完成的。变量一但没在首屏脚本里定义好,后续逻辑就全卡住。


















