在Web開發(fā)中對于這樣的一個流程可能很眼熟:
在接收端,腳本必須:
盡管上面的過程并不是很復(fù)雜,但是通常情況下需要編寫很多代碼,而且為了顯示錯誤信息,在網(wǎng)頁中經(jīng)常要使用多種不同的控制結(jié)構(gòu)。創(chuàng)建表單驗證雖簡單,實施起來實在枯燥無味。
對于開發(fā)者來說,一般開發(fā)過程都是相當(dāng)復(fù)雜,而且大多是在重復(fù)一樣的工作。假設(shè)一個場景項目中忽然需要增加一個表單數(shù)據(jù),那么局部代碼的整個流程都需要修改。我們知道Go里面struct是常用的一個數(shù)據(jù)結(jié)構(gòu),因此beego的form采用了struct來處理表單信息。
首先定義一個開發(fā)Web應(yīng)用時相對應(yīng)的struct,一個字段對應(yīng)一個form元素,通過struct的tag來定義相應(yīng)的元素信息和驗證信息,如下所示:
type User struct{
Username string `form:text,valid:required`
Nickname string `form:text,valid:required`
Age int `form:text,valid:required|numeric`
Email string `form:text,valid:required|valid_email`
Introduce string `form:textarea`
}
定義好struct之后接下來在controller中這樣操作
func (this *AddController) Get() {
this.Data["form"] = beego.Form(&User{})
this.Layout = "admin/layout.html"
this.TplNames = "admin/add.tpl"
}
在模板中這樣顯示表單
<h1>New Blog Post</h1>
<form action="" method="post">
{{.form.render()}}
</form>
上面我們定義好了整個的第一步,從struct到顯示表單的過程,接下來就是用戶填寫信息,服務(wù)器端接收數(shù)據(jù)然后驗證,最后插入數(shù)據(jù)庫。
func (this *AddController) Post() {
var user User
form := this.GetInput(&user)
if !form.Validates() {
return
}
models.UserInsert(&user)
this.Ctx.Redirect(302, "/admin/index")
}
以下列表列出來了對應(yīng)的form元素信息:
名稱 | 參數(shù) | 功能描述 |
---|---|---|
text | No | textbox輸入框 |
button | No | 按鈕 |
checkbox | No | 多選擇框 |
dropdown | No | 下拉選擇框 |
file | No | 文件上傳 |
hidden | No | 隱藏元素 |
password | No | 密碼輸入框 |
radio | No | 單選框 |
textarea | No | 文本輸入框 |
以下列表將列出可被使用的原生規(guī)則
規(guī)則 | 參數(shù) | 描述 | 舉例 |
---|---|---|---|
required | No | 如果元素為空,則返回FALSE | |
matches | Yes | 如果表單元素的值與參數(shù)中對應(yīng)的表單字段的值不相等,則返回FALSE | matches[form_item] |
is_unique | Yes | 如果表單元素的值與指定數(shù)據(jù)表欄位有重復(fù),則返回False(譯者注:比如is_unique[User.Email],那么驗證類會去查找User表中Email欄位有沒有與表單元素一樣的值,如存重復(fù),則返回false,這樣開發(fā)者就不必另寫Callback驗證代碼。) | is_unique[table.field] |
min_length | Yes | 如果表單元素值的字符長度少于參數(shù)中定義的數(shù)字,則返回FALSE | min_length[6] |
max_length | Yes | 如果表單元素值的字符長度大于參數(shù)中定義的數(shù)字,則返回FALSE | max_length[12] |
exact_length | Yes | 如果表單元素值的字符長度與參數(shù)中定義的數(shù)字不符,則返回FALSE | exact_length[8] |
greater_than | Yes | 如果表單元素值是非數(shù)字類型,或小于參數(shù)定義的值,則返回FALSE | greater_than[8] |
less_than | Yes | 如果表單元素值是非數(shù)字類型,或大于參數(shù)定義的值,則返回FALSE | less_than[8] |
alpha | No | 如果表單元素值中包含除字母以外的其他字符,則返回FALSE | |
alpha_numeric | No | 如果表單元素值中包含除字母和數(shù)字以外的其他字符,則返回FALSE | |
alpha_dash | No | 如果表單元素值中包含除字母/數(shù)字/下劃線/破折號以外的其他字符,則返回FALSE | |
numeric | No | 如果表單元素值中包含除數(shù)字以外的字符,則返回 FALSE | |
integer | No | 如果表單元素中包含除整數(shù)以外的字符,則返回FALSE | |
decimal | Yes | 如果表單元素中輸入(非小數(shù))不完整的值,則返回FALSE | |
is_natural | No | 如果表單元素值中包含了非自然數(shù)的其他數(shù)值 (其他數(shù)值不包括零),則返回FALSE。自然數(shù)形如:0,1,2,3....等等。 | |
is_natural_no_zero | No | 如果表單元素值包含了非自然數(shù)的其他數(shù)值 (其他數(shù)值包括零),則返回FALSE。非零的自然數(shù):1,2,3.....等等。 | |
valid_email | No | 如果表單元素值包含不合法的email地址,則返回FALSE | |
valid_emails | No | 如果表單元素值中任何一個值包含不合法的email地址(地址之間用英文逗號分割),則返回FALSE。 | |
valid_ip | No | 如果表單元素的值不是一個合法的IP地址,則返回FALSE。 | |
valid_base64 | No | 如果表單元素的值包含除了base64 編碼字符之外的其他字符,則返回FALSE。 |
更多建議: