Revel 參數(shù)驗證

2022-07-28 14:10 更新

Revel 自帶參數(shù)驗證功能:

  • 提供驗證上下文,用來收集和管理驗證錯誤(通過key 和 message)。
  • 輔助函數(shù)用來檢查數(shù)據(jù),并把錯誤信息帶到上下文中。
  • 一個模板函數(shù),從驗證上下文通過key獲取錯誤信息。

示例應用程序提供了一些深入理解參數(shù)驗證的例子。

內聯(lián)錯誤消息

下面演示使用內聯(lián)錯誤消息驗證字段

func (c MyApp) SaveUser(username string) revel.Result {
    // Username (required) 至少 4 - 15 個字符.
    c.Validation.Required(username)
    c.Validation.MaxSize(username, 15)
    c.Validation.MinSize(username, 4)
    c.Validation.Match(username, regexp.MustCompile("^\\w*$"))

    if c.Validation.HasErrors() {
        // 在flash上下文中保存驗證錯誤并重定向
        c.Validation.Keep()
        c.FlashParams()
        return c.Redirect(Hotels.Settings)
    }

    // All the data checked out!
    ...
}
  1. username字段驗證條件 (Required必填, MinSize最小長度, MaxSize最大長度, Match匹配一個正則表達式).
  2. 每個驗證條件返回一個 ValidationResult,如果驗證沒有通過,驗證結果會被保存到驗證上下文中。
  3. 作為構建應用程序的一部分,Revel記錄被驗證的變量的名稱,并使用它作為在驗證上下文的默認key(之后可以通過key獲取驗證錯誤消息)。
  4. Validation.HasErrors() 如果驗證沒有通過,返回 true
  5. Validation.Keep() 告訴 Revel 序列化 驗證錯誤消息到 Flash cookie中.
  6. Revel 重定向到 Hotels.Settings 方法.

Hotels.Settings 方法渲染一個模板:

{{/* app/views/Hotels/Settings.html */}}
...
{{if .errors}}Please fix errors marked below!{{end}}
...
<p class="{{if .errors.username}}error{{end}}">
    Username:
    <input name="username" value="{{.flash.username}}"/>
    <span class="error">{{.errors.username.Message}}</span>
</p>

它做了三件事:

  1. 檢查 errors map 中是否存在key為 username的錯誤字段.
  2. 帶回 username的字段值
  3. 在input下面顯示錯誤消息(如果沒有指定驗證字段出錯后的錯誤消息,則會顯示驗證函數(shù)默認的錯誤消息)

注意:模板函數(shù) field 使用了驗證錯誤框架,使模板的編寫變得更加方便。

置頂?shù)腻e誤消息

如果錯誤消息都顯示在一個地方,模板就變得簡單了 (比如,放到頁面頂部的一個紅色的盒子中.)

下面的例子與上面有兩個不同:

  1. 我們?yōu)樽侄沃付艘粋€驗證錯誤消息 Message,而不是使用驗證函數(shù)默認的錯誤信息
  2. 我們在頁面的上方打印所有的錯誤消息

代碼如下:

func (c MyApp) SaveUser(username string) revel.Result {
    // Username (必填) 至少 4 - 15 字符.
    c.Validation.Required(username).Message("Please enter a username")
    c.Validation.MaxSize(username, 15).Message("Username must be at most 15 characters long")
    c.Validation.MinSize(username, 4).Message("Username must be at least 4 characters long")
    c.Validation.Match(username, regexp.MustCompile("^\\w*$")).Message("Username must be all letters")

    if c.Validation.HasErrors() {
        // 保存錯誤信息到 flash 上下文中并重定向
        c.Validation.Keep()
        c.FlashParams()
        return c.Redirect(Hotels.Settings)
    }

    // All the data checked out!
    ...
}

模板如下:

{{/* app/views/Hotels/Settings.html */}}
...
{{if .errors}}
<div class="error">
    <ul>
    {{range .errors}}
        <li> {{.Message}}</li>
    {{end}}
    </ul>
</div>
{{end}}
...
以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號