如何使用Revel Golang处理来自html表单的动态输入数量

时间:2016-03-07 11:57:58

标签: html forms go revel

我有一个带有动态输入数量的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?

1 个答案:

答案 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,但是从表单中读取值的代码保持不变。