单选框值为空需检查name属性是否统一及是否选中;复选框须用formvalues获取多值;结构体绑定时radio用string、checkbox用[]string;js提交需设content-type为application/x-www-form-urlencoded。

单选框(radio)值总为空?检查 name 属性和绑定方式
Iris 默认不会自动解析表单中未勾选的 radio,但更常见的是后端收不到值——根本原因是前端 <input type="radio"> 的多个选项没共用同一个 name。Iris 依赖标准 HTML 表单提交规则:只有同名且被选中的那个 radio 才会作为键值对提交。
后端获取时,用 ctx.FormValue("field_name") 即可,不需要特殊处理:
// 前端示例
<input type="radio" name="gender" value="male">男
<input type="radio" name="gender" value="female">女
// 后端
gender := ctx.FormValue("gender") // 返回 "male" 或 "female" 或空字符串(都没选)
- 如果返回空,先确认浏览器开发者工具 Network → Form Data 中是否有该字段;没有则前端
name不一致或没选中 - Iris 不校验是否必选,需手动判断:
if gender == "" { /* 处理缺失 */ } - 不要用
ctx.PostValue("gender")替代FormValue,二者在 multipart/form-data 场景下行为不等价
复选框(checkbox)只拿到一个值?要用 FormValues
HTML 中未勾选的 checkbox 根本不会出现在请求体里,所以 Iris 只能拿到已勾选项。但如果你用 ctx.FormValue("hobbies"),永远只返回第一个值(即使勾了多个),这是常见误区。
正确做法是用 ctx.FormValues("hobbies"),它返回 []string:
<input type="checkbox" name="hobbies" value="reading">阅读
<input type="checkbox" name="hobbies" value="swimming">游泳
<input type="checkbox" name="hobbies" value="coding">写代码
<p>// 后端
hobbies := ctx.FormValues("hobbies") // []string{"reading", "coding"}
</p>
- 如果用户一个都没选,
FormValues返回空切片[]string{},不是nil - 别试图用
ctx.PostValueDefault给 checkbox 设默认值——它对未提交的字段无效 - 若需布尔语义(如“是否同意协议”),建议单独设一个
agree字段,用单个checkbox+ 显式判断:agree := ctx.FormValue("agree") == "on"
绑定到结构体时 radio/checkbox 字段怎么声明?
Iris 的 ctx.ReadForm(&v) 支持自动映射,但字段类型必须匹配:
- 单选框 → 结构体字段用
string,例如Gender string `form:"gender"` - 复选框 → 必须用
[]string,例如Hobbies []string `form:"hobbies"`;用string或[]interface{}都会静默失败或 panic - 字段标签里的
form名必须和 HTMLname完全一致(区分大小写) - 如果 checkbox 提交的是数字 ID,比如
value="123",结构体仍应声明为[]string,后续再strconv.Atoi转换;Iris 不做自动类型推导
为什么 POST 请求里取不到 checkbox 数据?检查 Content-Type
最隐蔽的坑:前端用 fetch 或 axios 提交表单时,若没设 Content-Type: application/x-www-form-urlencoded,Iris 就不会触发表单解析逻辑,FormValue 和 FormValues 全部返回空。
- 原生
<form></form>提交默认是正确类型,没问题 - JS 提交时务必显式设置:
headers: {'Content-Type': 'application/x-www-form-urlencoded'} - 或者改用
URLSearchParams构造 payload:const data = new URLSearchParams(); data.append('hobbies', 'reading'); ... fetch(..., { body: data }) - Iris 不解析
application/json里的表单字段,哪怕 JSON 内容长得像表单数据
Iris 对表单字段的处理完全遵循 HTTP 规范,它不做猜测、不补默认值、不自动转换类型——这意味着你得严格对齐前端 name、后端接收方式和结构体声明,少一个环节就拿不到数据。











