2016-01-20 139 views
1

我一直在網上淘,並不能找到太多的所有關於張貼到HTML模板和形式golang爲模板。這是我在這傳遞一個字符串在golang

我的錯誤 不能在參數中使用「HTML /模板」 .HTML(「 登錄」)(類型爲‘HTML /模板’.HTML)類型的字符串爲「HTML /模板嘗試 」。新的( 「富」)。解析

我想在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>[email protected]</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) 
} 


} 

處理程序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) 
    } 

} 
+0

得到了答案。 ERR:=是getTemplate( 「登錄」)。執行(response,viewModel) –

回答

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