我一直在搜寻互联网,根本找不到关于在golang中发布到html模板和表单的任何信息。 这是我的尝试
我的错误
不能使用" html / template"。HTML("
登录")(类型" html / template" .HTML)作为类型字符串,作为" html / template"的参数
" .New(" foo")。Parse
我想将值传递给html文件中的{{.ErrorMessage}}
我的HTML(login.html)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | {{ define"content"}} {{.ErrorMessage}} form action="/login" method="POST"> Username:input type="username" name="username"> Password:input type="password" name="password"> input type="submit" value="Submit"> /form> {{end}} {{define"extra_head"}} Title{{end}} {{define"nav"}}{{end}} {{define"extra_footer"}}<footer>[email protected]</footer>{{end}} {{template"_layout.html" .}} |
主G0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | package main import ( "net/http" "ere.com/handlers" ) func main() { http.HandleFunc("/register", handlers.RegisterHandler) // setting router rule http.HandleFunc("/sucess", handlers.RegisterSucessHandler) http.HandleFunc("/login", handlers.LoginHandler) http.HandleFunc("/update", handlers.UpdateHandler) http.HandleFunc("/logout", handlers.LogoutHandler) http.HandleFunc("/header", handlers.HeaderHandler) if err := http.ListenAndServe(":8181", nil); err != nil { //log.Fatal("http.ListenAndServe:", err) } } |
处理程序int
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | package handlers import ( "html/template" ) func GetTemplate(name string) *template.Template{ tmpl := template.Must(template.ParseFiles( "frontend/templates/_layout.html", "frontend/templates/" + name +".html", )) return tmpl } |
LoginHandler
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | type viewModel struct { Id bson.ObjectId Email string Password string FirstName string LastName string ErrorMessage string } func LoginHandler (response http.ResponseWriter, request *http.Request) { viewModel:=viewmodels.RegisterViewModel{} if (request.Method =="POST") { request.ParseForm() user := models.User{} user.Email = request.Form.Get("username") user.Password = request.Form.Get("password") boolUser, userID := user.FindUserDB() if (boolUser != true) { viewModel.ErrorMessage ="incorrect username or password" //need help here t, err := template.New("foo").Parse(template.HTML("login")) err = t.ExecuteTemplate(response,"T", viewModel) err := GetTemplate("login").Execute(response, nil, ) if err != nil { panic(err) } }else { setSession(userID, response) http.Redirect(response, request,"/update", 302) } }else { err := GetTemplate("login").Execute(response, nil,) if err != nil { panic(err) } } |
- 得到了答案。 err:= GetTemplate(" login")。Execute(response,viewModel)
错误在这一行:
1 | t, err := template.New("foo").Parse(template.HTML("login")) |
这:
1 | t, err := template.New("foo").Parse("login") |
尽管这几乎不是您想要的,但您必须将模板文本传递给
实际上,由于这是随后发生的(顺便说一句语法错误):
1 | err := GetTemplate("login").Execute(response, nil, ) |
您甚至不需要有错误的行...因此只需删除以下两行:
1 2 | t, err := template.New("foo").Parse(template.HTML("login")) err = t.ExecuteTemplate(response,"T", viewModel) |
并且看起来您想将
1 | err := GetTemplate("login").Execute(response, viewModel) |
一个建议:不要在处理程序中解析模板,这效率很低,而是在应用程序启动时解析它们,而只是重用解析后的模板。阅读此问题以获取更多说明:
使用"模板"包在golang中为客户端生成动态网页需要花费太多时间