英文:
How get multiselect values from form using Golang?
问题
我在我的表单中有一个多选输入框,我想在处理程序中获取选定的值,但是我无法获取,我该如何获取这些值?
<form action="process" method="post">
<select id="new_data" name="new_data" class="tag-select chzn-done" multiple="" style="display: none;">
<option value="1">111mm1</option>
<option value="2">222mm2</option>
<option value="3">012nx1</option>
</select>
</form>
我的处理程序:
func myHandler(w http.ResponseWriter, r *http.Request) {
fmt.Println(r.FormValue("new_data")) // 结果-> []
fmt.Println(r.Form("new_data")) // 结果-> []
}
从JS控制台序列化的表单数据,选中了选项1和2:
>$('#myform').serialize()
>"new_data=1&new_data=2"
英文:
I have a multiple select input in my form and I'm trying to get the selected values in my handler, but I can't, how can I get those values?
<form action="process" method="post">
<select id="new_data" name="new_data class="tag-select chzn-done" multiple="" style="display: none;">
<option value="1">111mm1</option>
<option value="2">222mm2</option>
<option value="3">012nx1</option>
</select>
</form>
My Handler:
func myHandler(w http.ResponseWriter, r *http.Request) {
fmt.Println(r.FormValue("new_data")) // result-> []
fmt.Println(r.Form("new_data")) // result-> []
}
The form serialized data with option 1 and 2 selected from JS console:
>$('#myform').serialize()
>"new_data=1&new_data=2"
答案1
得分: 20
你不能/不应该使用Request.FormValue()
函数,因为它只返回一个值。应该使用Request.Form["new_data"]
,它是一个包含所有值的字符串切片。
但是请注意,如果你不调用r.FormValue()
,你必须通过显式调用Request.ParseForm()
来触发表单解析(并填充Request.Form
映射)。
你还有一个HTML语法错误:name
属性的值没有关闭,将其改为:
<select id="new_data" name="new_data" class="tag-select chzn-done" multiple="" style="display: none;">
这是一个完整的应用程序,用于测试它是否工作(省略了错误检查!):
package main
import (
"fmt"
"net/http"
)
func myHandler(w http.ResponseWriter, r *http.Request) {
if r.Method == "POST" {
// 表单提交
r.ParseForm() // 如果不调用r.FormValue(),则需要调用此方法
fmt.Println(r.Form["new_data"])
}
w.Write([]byte(html))
}
func main() {
http.HandleFunc("/", myHandler)
http.ListenAndServe(":9090", nil)
}
const html = `
<html><body>
<form action="process" method="post">
<select id="new_data" name="new_data" class="tag-select chzn-done" multiple="" >
<option value="1">111mm1</option>
<option value="2">222mm2</option>
<option value="3">012nx1</option>
</select>
<input type="Submit" value="Send" />
</form>
</body></html>
`
英文:
You can't/shouldn't use the Request.FormValue()
function because that only returns 1 value. Use Request.Form["new_data"]
which is a slice of string
s containing all the values.
But note that if you don't call r.FormValue()
, you have to trigger parsing the form (and populating the Request.Form
map) by calling Request.ParseForm()
explicitly.
You also have an HTML syntax error: the value of the name
attribute is not closed, change it to:
<select id="new_data" name="new_data" class="tag-select chzn-done"
multiple="" style="display: none;">
Here is a complete app to test that it works (error checks ommited!):
package main
import (
"fmt"
"net/http"
)
func myHandler(w http.ResponseWriter, r *http.Request) {
if r.Method == "POST" {
// Form submitted
r.ParseForm() // Required if you don't call r.FormValue()
fmt.Println(r.Form["new_data"])
}
w.Write([]byte(html))
}
func main() {
http.HandleFunc("/", myHandler)
http.ListenAndServe(":9090", nil)
}
const html = `
<html><body>
<form action="process" method="post">
<select id="new_data" name="new_data" class="tag-select chzn-done" multiple="" >
<option value="1">111mm1</option>
<option value="2">222mm2</option>
<option value="3">012nx1</option>
</select>
<input type="Submit" value="Send" />
</form>
</body></html>
`
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论