Golang中单选按钮验证的实现方法

Golang中单选按钮验证的实现方法 我尝试进行单选按钮验证。 我参考了这个教程:https://astaxie.gitbooks.io/build-web-application-with-golang/en/04.2.html 唯一的问题是,当我使用if语句时出现了错误,我不明白为什么。

main.go

func send(w http.ResponseWriter, r *http.Request) {
gender:= []int{1, 2, 3}
msg := &Message{
Name:    r.FormValue("name"),
Surname: r.FormValue("surname"),
BDay:    r.FormValue("bday"),
Gender:     r.FormValue("gender"),
}

for _, v := range gender{
if v == r.Form.Get("gender") {
msg.Errors["Gender"] = "Please choose your Gender"

}

if msg.Validate() == false {
	render(w, "templates/index.html", msg)
	return
}
// 发送邮件消息
// 重定向到确认页面
}

实际上,for循环应该在另一个页面message.go中,但是我没有r *http.Request,我考虑把它放在main.go中。

message.go

type Message struct {
Name    string
Surname string
BDay    string
Gender     string
City    string
Errors  map[string]string
}

func (msg *Message) Validate() bool {

msg.Errors = make(map[string]string)
if strings.TrimSpace(msg.Name) == "" {
	msg.Errors["Name"] = "Please write your Name"
}
if strings.TrimSpace(msg.Surname) == "" {
	msg.Errors["Surname"] = "Please write your Surname"
}
//处理日期
if strings.TrimSpace(msg.BDay) == "" {
	msg.Errors["BDay"] = "Please select your BDay"
}

//处理单选按钮

if strings.TrimSpace(msg.City) == "" {
	msg.Errors["City"] = "Please write your City"
}

return len(msg.Errors) == 0
}

更多关于Golang中单选按钮验证的实现方法的实战教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

很抱歉,在我脑海中读出来时感觉不太妥当。我也以为您已经了解这件事了。

更多关于Golang中单选按钮验证的实现方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我并没有"指责别人在语言允许范围内做某事的方式"。我完全没有对代码风格做出任何评论,只是建议使用ParseForm,因为我当时认为这是必要的。

2个赞

首先,将你的代码放在能够良好格式化的地方(如Github Gist、Go Playground等),或者使用三个反引号确保在此处正确格式化。

其次,你并未告诉我们具体的错误信息是什么。

第三,看起来你在尝试检查表单值之前,实际上并未使用 r.ParseForm() 来解析它们。

func main() {
    fmt.Println("hello world")
}

你提出了一些很好的观点,老实说我认为使用反引号分享代码比共享代码库更可取,Playground示例很棒。但是指责别人在语言允许范围内使用有效方法的行为就不太好了。Request类型的FormValue方法可以在不调用ParseForm或ParseMultipartForm的情况下调用,因为如果需要的话,FormValue会自动调用这些方法:https://godoc.org/net/http#Request.FormValue

在你的代码中,单选按钮验证存在几个问题。主要问题是类型不匹配和验证逻辑错误。

以下是修正后的代码:

main.go

func send(w http.ResponseWriter, r *http.Request) {
    msg := &Message{
        Name:    r.FormValue("name"),
        Surname: r.FormValue("surname"),
        BDay:    r.FormValue("bday"),
        Gender:  r.FormValue("gender"),
        City:    r.FormValue("city"),
        Errors:  make(map[string]string),
    }

    // 验证数据
    if !msg.Validate() {
        render(w, "templates/index.html", msg)
        return
    }

    // 发送邮件消息
    // 重定向到确认页面
}

message.go

type Message struct {
    Name    string
    Surname string
    BDay    string
    Gender  string
    City    string
    Errors  map[string]string
}

func (msg *Message) Validate() bool {
    msg.Errors = make(map[string]string)
    
    if strings.TrimSpace(msg.Name) == "" {
        msg.Errors["Name"] = "Please write your Name"
    }
    
    if strings.TrimSpace(msg.Surname) == "" {
        msg.Errors["Surname"] = "Please write your Surname"
    }
    
    if strings.TrimSpace(msg.BDay) == "" {
        msg.Errors["BDay"] = "Please select your BDay"
    }
    
    // 单选按钮验证
    if strings.TrimSpace(msg.Gender) == "" {
        msg.Errors["Gender"] = "Please choose your Gender"
    } else {
        // 确保性别值是有效的
        validGenders := map[string]bool{"1": true, "2": true, "3": true}
        if !validGenders[msg.Gender] {
            msg.Errors["Gender"] = "Please select a valid Gender option"
        }
    }
    
    if strings.TrimSpace(msg.City) == "" {
        msg.Errors["City"] = "Please write your City"
    }

    return len(msg.Errors) == 0
}

HTML表单示例

<form method="POST" action="/send">
    <input type="text" name="name" value="{{.Name}}">
    <input type="text" name="surname" value="{{.Surname}}">
    
    <!-- 单选按钮组 -->
    <input type="radio" name="gender" value="1" {{if eq .Gender "1"}}checked{{end}}> Male
    <input type="radio" name="gender" value="2" {{if eq .Gender "2"}}checked{{end}}> Female
    <input type="radio" name="gender" value="3" {{if eq .Gender "3"}}checked{{end}}> Other
    
    <input type="text" name="city" value="{{.City}}">
    <input type="submit" value="Send">
</form>

主要修改点:

  1. 将单选按钮验证逻辑移到Validate()方法中
  2. 修复了类型不匹配问题(r.FormValue()返回字符串,不能直接与整数比较)
  3. 使用map来验证有效的性别选项
  4. 在HTML模板中添加了保持选中状态的逻辑

这样实现后,当用户没有选择任何性别选项时,会显示验证错误信息。

回到顶部