将字符串传递给golang中的模板

时间:2016-01-20 07:56:37

标签: go

我一直在搜索互联网,并且在golang中发布到html模板和表单方面找不到多少。这是我的尝试

我的错误 不能使用" html / template" .HTML(" 登录")(键入" html / template" .HTML)作为" html / template的参数中的类型字符串 "。新("富&#34)。解析

我想在html文件

中将值传递给{{.ErrorMessage}}

我的HTML(login.html)

{{ define "content"}}
<h2> {{.ErrorMessage}}</h2>


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>Title</title>{{end}}
{{define "nav"}}{{end}}


{{define "extra_footer"}}<footer>copyright@xyz.com</footer>{{end}}
{{template "_layout.html" .}}

MAIN.G0

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


}

handler int

    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

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

}

1 个答案:

答案 0 :(得分:1)

错误在这一行:

t, err := template.New("foo").Parse(template.HTML("login"))

template.Parse()方法需要一个类型为string的参数,并为其传递一个template.HTML类型的参数。

这:template.HTML("login")是类型转换,它将string"login"转换为template.HTML类型。这不是必需的。只需使用:

t, err := template.New("foo").Parse("login")

虽然这不是您想要的,但您必须将模板文本传递给Parse()方法,而不是文件名!很可能你想打电话给Template.ParseFiles()

事实上,由于这是以下内容(这是一个语法错误顺便说一下):

err := GetTemplate("login").Execute(response, nil, )

你甚至不需要有错误的行...所以只需删除这两行:

t, err := template.New("foo").Parse(template.HTML("login"))
err = t.ExecuteTemplate(response, "T", viewModel)

并且您希望将viewModel作为参数传递给模板,因此请在下一行中执行此操作并删除最后一个逗号,以使其编译:

err := GetTemplate("login").Execute(response, viewModel)

建议:不要解析处理程序中的模板,效率非常低,而是在应用程序启动时解析它们,只需重用解析后的模板即可。阅读此问题以获得更多解释:

It takes too much time when using "template" package to generate a dynamic web page to client in golang