2016-03-07 91 views
0

我有一個帶有動態輸入數量的html表單。每個輸入必須是一個Model對象,並且我還有一個函數,它接收來自這個輸入的值。 我的HTML表單:如何使用Revel Golang處理來自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 
} 

如何發送形式的價值觀與包裝,以標準答案分得一杯羹?

回答

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() 
} 

上面的例子是就像當你啓動一個項目,名爲text的輸入來狂歡產生的一個簡單的應用程序,並可以適應您的具體情況。

values變量是[]string型的,這就是爲什麼登錄,如果您提交與查詢字符串?text=value1&text=value2&text=value3一個GET請求,如將與name="text"發生的形式method="GET"和三個文本輸入以下內容:

2016/03/07 22:16:41 app.go:19: value1 
2016/03/07 22:16:41 app.go:19: value2 
2016/03/07 22:16:41 app.go:19: value3 

問題中的表單恰好使用方法POST,但用於從表單讀取值的代碼保持不變。