iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 28
0
自我挑戰組

C# 從入門到WebApi系列 第 28

[Day28] 模型驗證

  • 分享至 

  • xImage
  •  

前言

其實我已經不知道我還會甚麼還能講甚麼
熊熊之間想到Model Binding這東西可以稍微講一下
明後天可能就開天窗了

模型繫結

這部分就做個補充
根據預設模型繫結會從下列 HTTP 要求的來源中
取得索引鍵/值組形式的資料:

  • 表單欄位
  • 具有 [ApiController] 屬性之控制器的要求主體
  • 路由傳送資料(Route({id}))
  • 查詢字串參數(QueryString)
  • 已上傳的檔案

如果預設來源不正確
使用下列其中一個屬性來指定來源:

  • [FromQuery] -取得查詢字串中的值。
  • [FromRoute] -從路由資料取得值。
  • [FromForm] -從張貼的表單欄位取得值。
  • [FromBody] -從要求主體取得值。
  • [FromHeader] -取得 HTTP 標頭的值。

模型驗證

我們來看看前幾張我們講的[ApiController]
在過去我們使用.Net FrameWork 時
我們使用ModelState.IsValid
來確認我們的模型資料是否符合我們的規範
在套用[ApiController]之後
我們不用再透過ModelState.IsValid 的語法來檢查
只要你傳入的東西不符合規定
就會自動回傳400 BadRequest

來看看怎麼對我們的模型作約束
我們一樣打開之前的專案

我們打開Product.cs
先引用命名空間

using System.ComponentModel.DataAnnotations;

在要驗證的欄位前面加入標籤

namespace MyFirstApi.Model
{
    public class Product
    {
        [Required]
        [StringLength(maximumLength:5,MinimumLength = 5, ErrorMessage = "請輸入5個字元")]
        public string Id { get; set; }
        [Required]
        [MaxLength(10, ErrorMessage = "名字長度不得超過10")]
        public string Name { get; set; }
        [MinLength(2)]
        public string Origin { get; set; }
        [Range(20,50)]
        public int Price { get; set; }
    }
}

[Required]標籤表示欄位為必填
[StringLength]標籤表示欄位的長度必須介於max到min中
使用ErrorMessage能夠自訂錯誤訊息
[MaxLength]標籤表示欄位最大長度
[MinLength]標籤表示欄位最小長度
[Range(20,50)]表示數字需介於20-50之間

我們執行專案
試著加入一筆資料

{
	"ID":"F001",
	"Name": "葡萄",
	"Origin": "US",
	"Price": 80
}

https://ithelp.ithome.com.tw/upload/images/20200928/20109549moPke4BQ6q.png

可以看見因為ID的長度不對
而且價格>50
因此出現了兩個錯誤訊息

附上常用標籤

下列是部分內建驗證屬性:

  • [CreditCard]:驗證屬性是否具有信用卡格式。 需要 JQuery 驗證的其他方法。
  • [Compare]:驗證模型中的兩個屬性是否相符。
  • [EmailAddress]:驗證屬性具有電子郵件格式。
  • [Phone]:驗證屬性具有電話號碼格式。
  • [Range]:驗證屬性值是否落在指定的範圍內。
  • [RegularExpression]:驗證屬性值是否符合指定的正則運算式。
  • [Required]:驗證欄位不是 null。 如需此屬性行為的詳細資訊,請參閱 [Required] 屬性。
  • [StringLength]:驗證字串屬性值不超過指定的長度限制。
  • [Url]:驗證屬性是否具有 URL 格式。
  • [Remote]:在伺服器上呼叫動作方法,以驗證用戶端上的輸入。 如需此屬性行為的詳細資訊,請參閱 [Remote] 屬 性。

可以在 System.ComponentModel.DataAnnotations 命名空間中找到驗證屬性的完整清單。


上一篇
[Day27] 用ORM進行資料庫操作
下一篇
[Day29] 來做個簡單的Line機器人吧
系列文
C# 從入門到WebApi30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言