我有一个带有动态输入数量的html表单。每个输入必须是Model对象,并且我还有一个函数,它接收来自此输入的值。 我的HTML格式:
<form action="{{url "Votes.CreateVote"}}" id="formVoteCreate" method="POST">
<p class="field">
<label>Question:</label>
<input type="text" name="question" size="40" />
</p>
<div ng-repeat="answer in answers">
<p class="field">
<label>//stuff.title//:</label>
<input type="text" name=//stuff.name// size="40" />
</p>
</div>
<p>
<input ng-click="addInput()" class="btn" type="button" value="Add answer">
</p>
<p class="buttons">
<input class="btn" type="submit" value="Create" />
</p>
</form>
并且狂欢golang处理程序:
func (c Votes) CreateVote() revel.Result {
// in this place i want get a slice with answers from html form
return c.Redirect(routes.App.Index())
}
并回答模型:
type Answer struct {
Model
Text string
}
如何将表单的值作为切片发送,并将答案打包到Model?
答案 0 :(得分:1)
每个Revel控制器附带一个附加的Request
,它实际上只是一个普通的Go标准库Request
。因此,这与普通的Go Web服务器相同,因为我们不能使用Request.Form.Get("inputname")
方法,因为这只会给出第一个结果。相反,我们需要直接访问Form
地图中的值:
package controllers
import (
"log"
"github.com/robfig/revel"
)
type App struct {
*revel.Controller
}
func (c App) Index() revel.Result {
if err := c.Request.ParseForm(); err != nil {
// handle error
}
values := c.Request.Form["text"]
for i := range values {
log.Println(values[i])
}
return c.Render()
}
上面的示例适用于一个简单的应用程序,例如Revel在您启动项目时生成的应用程序,其输入名为text
,并且可以根据您的具体情况进行调整。
values
变量属于[]string
类型,这就是为什么如果您提交带有查询字符串?text=value1&text=value2&text=value3
的GET请求,则会记录以下内容,就像带有{的表单一样{1}}以及method="GET"
的三个文字输入:
name="text"
问题中的表单碰巧使用方法POST,但是从表单中读取值的代码保持不变。