我有一个表单html,如:
<input name="email"type="email" />
<input name="password"type="password" />
<input name="tags[name][]"type="text" />
<input name="tags[count][]"type="number" />
<input name="tags[name][]"type="text" />
<input name="tags[count][]"type="number" />
<input name="tags[name][]"type="text" />
<input name="tags[count][]"type="number" />
<input name="freeword[]"type="text" />
<input name="freeword[]"type="text" />
我想要Bind()
这样的表格struct
:
type UserFrom struct {
Email string `json:"email" form:"email" query:"email"`
Password string `json:"password" form:"password" query:"password"`
Tags []Tag
Free []string `json:"freeword[]" form:"freeword[]" query:"freeword[]"`
}
type Tag struct {
Name string `json:"tags[name][]" form:"tags[name][]" query:"tags[name][]"`
Count string `json:"tags[count][]" form:"tags[count][]" query:"tags[count][]"`
}
但是如果我打印出Bind()
after 的结果POST
:
u := new(UserFrom)
if err = c.Bind(u); err != nil {
return
}
log.Println(u)
这个不好的输出:
&{[email protected] pwdpwdpwd [] [word1 word2]}
该行Tags []Tag
于UserFrom
结构不起作用
如果y尝试更改Tags []Tag
为Tags Tag
我有一个很好的最后一个条目
&{[email protected] pwdpwdpwd {tag3 3} [word1 word2]}
我想要这个输出:
&{[email protected] pwdpwdpwd [{tag1 1} {tag2 2} {tag3 3}] [word1 word2]}
你对这个问题有想法吗?
有两个问题:
tags[][name]
为了实现您想要的名称,名称应该像这样,例如,请参见此处:HTML表单:POST对象数组http.Request.Form
解析值,实际上url.Values
这实际上只是一个map[string][]string
。如您所见,这可能无法捕获您想要的结构。这是相关的票证:https : //github.com/golang/go/issues/29703现在,仅因为Echo不支持该功能,并不意味着您无法做到这一点。您可以使用具有所需功能的第三方库进行绑定,例如https://github.com/monoculum/formam
如下代码:
package main
import (
"fmt"
"net/url"
"github.com/monoculum/formam"
)
type User struct {
Email,
Password string
Tags []struct {
Tag string
Count int
}
}
func main() {
formData := "[email protected]&Password=secret&Tags[0].Tag=red&" +
"Tags[0].Count=1&Tags[1].Tag=blue"
q, _ := url.ParseQuery(formData)
u := new(User)
dec := formam.NewDecoder(nil)
if err := dec.Decode(q, u); err != nil {
fmt.Println(err)
return
}
fmt.Println(u)
}
满足您的需求:
&{[email protected] secret [{red 1} {blue 0}]}
希望这可以帮助!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句