Golang,没有从HTML传递值

时间:2016-08-25 15:11:26

标签: html forms http go

我正在尝试构建一个简单的两个Handler Web服务器。在第一个处理程序中,我从两个字段中提取值,即用户的名字和姓氏。在第二个处理程序中,我只是说明"Hello" (first name, last name)

我已经放了fmt.Println,似乎我没有正确地将第一个Handler的信息拉回到Go编程中。哪里出错了?

package main

import (
    "fmt"
    "html/template"
    "log"
    "net/http"
)

type Field struct {
    Firstname  string
    Secondname string
}

func RootHandler(w http.ResponseWriter, r *http.Request) {
    tmpl, err := template.ParseFiles("index.html")
    if err != nil {
        fmt.Println("Index Template Parse Error: ", err)
    }
    err = tmpl.Execute(w, nil)
    if err != nil {
        fmt.Println("Index Template Execution Error: ", err)
    }

}

func main() {
    http.HandleFunc("/", RootHandler) // sets router
    http.HandleFunc("/welcome", WelcomeHandler)
    err := http.ListenAndServe(":4000", nil) // set listen port
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

func WelcomeHandler(w http.ResponseWriter, r *http.Request) {

    Firstname := r.FormValue("Namef")
    Secondname := r.FormValue("Namel")
    fmt.Println(Firstname)

    f := new(Field)
    f.Firstname = Firstname
    f.Secondname = Secondname
    fmt.Println(*f)
    tmpl, err := template.ParseFiles("tmpl/welcome.tmpl")
    if err != nil {
        fmt.Println("Index Template Parse Error: ", err)
    }
    err = tmpl.Execute(w, &f)
    if err != nil {
        fmt.Println("Index Template Execution Error: ", err)
    }

}

以下是我index.html从中提取两个值:

<!DOCTYPE html>
<html>
<body>

<form action="/welcome" method="post">
<p> Welcome! First I will need your full name: </p>
First Name: <input type="text" id="Namef" name="FirstName"><br>
Last Name:  <input type="text" id="Namel" name="LastName" ><br>
<input type="submit" value="Next">
</form>

<p>Click the "Submit" button and the form-data will be sent to a page on the server called "demo_form.asp".</p>

</body>
</html>

1 个答案:

答案 0 :(得分:5)

问题是您尝试使用错误的名称获取表单值。

您必须使用您在HTML文档中用作name属性的值,而不是id

Firstname := r.FormValue("FirstName")
Secondname := r.FormValue("LastName")

这可能只是您的部分练习代码,但从不在处理程序中解析模板。解析模板是一项相对资源密集型的任务,您应该只执行一次,并且由于模板对于并发使用是安全的,因此您可以使用来自多个goroutine的单个template.Template值(服务并发请求)。有关详细信息,请参阅此问题:It takes too much time when using "template" package to generate a dynamic web page to client in golang