あなたのフォーム送信が、HTTP応答(リダイレクト)を返すvalidate()
ハンドラに向けられている場合、ブラウザは/register
をもう一度呼び出します。 validate()
ハンドラとregister()
ハンドラの間に接続がありません。*http.Request
の値は、ブラウザが別のHTTP要求を行うのと同じではないため、別の*http.Request
値が作成され、2番目の呼び出しで渡されます。
リダイレクトURLにパラメータを指定できます(例: /register?someParam=someValue
にリダイレクトしますが、それは単なる不要なラウンドトリップであり、複雑なものになります。
より簡単な解決策は、(ハンドラレベルで)フォームのレンダリングと検証を分けないことです。同じハンドラで両方を処理できるので、2つのハンドラ間でデータの共有は必要ありません。
例:もちろん
func register(w http.ResponseWriter, r *http.Request) {
// Params for rendering the page
m := map[string]interface{}{}
// Is form submitted?
if r.FormValue("submitRegister") != "" {
// check submitted values
// E.g. check email, let's say it's already in use:
email := r.FormValue("Email")
if alreadyInUse {
m["Error"] = "Email already in use!"
}
if m["Error"] == "" {
// If all values are OK, create user, and redirect:
http.Redirect(w, r, "/home", http.StatusFound)
return // AND return!
}
// Store submitted values in params, so when we render
// the registration form again, we fill submitted params as initial values,
// so user don't have to fill everything again (expect maybe the password)
m["Email"] = email
}
// Either no submit or validation errors
// Render the registration form, using submitted values as initial ones
// Also if m["Error"] is set, render the error above the form
registerTempl.Execute(w, m)
}
は、あなたが関数にそれを打破することができ、あなたは別のvalidate()
機能を持たせることができるが、それでもフォームを提出やレジスタページと同じパスを指すように持っている(たとえば、 /register
):
func register(w http.ResponseWriter, r *http.Request) {
// Params for rendering the page
m := map[string]interface{}{}
// Is form submitted?
if r.FormValue("submitRegister") != "" {
validate(w, r, m)
if m["Error"] == "" {
return // AND return!
}
}
// Either no submit or validation errors
// Render the registration form, using submitted values as initial ones
// Also if m["Error"] is set, render the error above the form
registerTempl.Execute(w, m)
}
func validate(w http.ResponseWriter, r *http.Request, m map[string]interface{}) {
// check submitted values
// E.g. check email, let's say it's already in use:
email := r.FormValue("Email")
if alreadyInUse {
m["Error"] = "Email already in use!"
}
if m["Error"] == "" {
// If all values are OK, create user, and redirect:
http.Redirect(w, r, "/home", http.StatusFound)
return
}
// Store submitted values in params, so when we
// render the registration form again, we fill submitted params as initial values,
// so user don't have to fill everything again (expect maybe the password)
m["Email"] = email
}
ありがとうございます。icza。 1つのハンドラ関数ですべてを行うことは、より洗練されたソリューションのようです。 – rishflab