[C#] 輕鬆驗證資料:探索.NET 8中對System.ComponentModel.DataAnnotations的增強支持

2024-01-19

最近在看 .Net8 新功能,發現 對於 System.ComponentModel.DataAnnotations 增加了許多的擴充

變得方便許多,今天就來簡單的測試一下


今天主要測試幾個常用的 type,很簡單的 class 分別設定如下 

using System.ComponentModel.DataAnnotations; namespace CodeLab.Models { public class User { /// <summary> /// 只能四個字 /// </summary> [StringLength(maximumLength:4,MinimumLength =4, ErrorMessage = "Id錯誤:只能四個字"),Required(ErrorMessage ="Id不可以空白")] public string Id { get; set; } /// <summary> /// string 僅能接受 有限的選項 /// </summary> [AllowedValues("男", "女", "未知", ErrorMessage = "Gender錯誤:男,女,未知"), Required(ErrorMessage = "Gender不可以空白")] public string Genger { get; set; } /// <summary> /// string array 僅能接受有限的選線 /// </summary> [AllowedValues("睡覺", "電影", "其他", ErrorMessage = "Hobbies錯誤"), Required(ErrorMessage = "Hobbies 不可為空")] public string[] Hobbies {get;set;} /// <summary> /// 有限的範圍 /// </summary> [Range(1000,20000,ErrorMessage ="Salary錯誤") , Required(ErrorMessage = "Salary 不可為空")] public decimal Salary { get; set; } } }


接下來就是在使用端的時候怎麼進行驗證

.cshtml  的部分


&lt;form method=&quot;post&quot;&gt; &lt;input name=&quot;id&quot; placeholder=&quot;Id&quot; class=&quot;form-control&quot; /&gt;&lt;br /&gt; &lt;select name=&quot;gender&quot; class=&quot;form-control&quot;&gt; &lt;option value=&quot;男&quot;&gt;男&lt;/option&gt; &lt;option value=&quot;女&quot;&gt;女&lt;/option&gt; &lt;option value=&quot;故意出錯&quot;&gt;故意出錯&lt;/option&gt; &lt;option value=&quot;其他&quot;&gt;其他&lt;/option&gt; &lt;/select&gt;&lt;br /&gt; &lt;input name=&quot;salary&quot; placeholder=&quot;Salary&quot; type=&quot;number&quot; class=&quot;form-control&quot; /&gt;&lt;br /&gt; &lt;select name=&quot;hobby&quot; multiple class=&quot;form-control&quot;&gt; &lt;option value=&quot;睡覺&quot;&gt;睡覺&lt;/option&gt; &lt;option value=&quot;電影&quot;&gt;電影&lt;/option&gt; &lt;option value=&quot;故意出錯&quot;&gt;故意出錯&lt;/option&gt; &lt;option value=&quot;其他&quot;&gt;其他&lt;/option&gt; &lt;/select&gt;&lt;br /&gt; &lt;button asp-page-handler=&quot;Save1&quot; class=&quot;btn btn-primary&quot;&gt;Save&lt;/button&gt; &lt;/form&gt; &lt;div&gt; Result:&lt;br /&gt; @Html.Raw(Model.Result) &lt;/div&gt; &lt;div style=&quot;color:red&quot;&gt; Error Message:&lt;br /&gt; @Html.Raw(Model.ErrorMessage) &lt;/div&gt;


C# 驗證的部分:

public IActionResult OnPostSave1(string id,string gender, string[] hobby,decimal salary) { var u = new User(); u.Id = id; u.Genger = gender; u.Hobbies = hobby; u.Salary = salary; //進行驗證 物件是不是符合 DataAnnotations 的設定 var context = new ValidationContext(u, null, null); List<ValidationResult> validationResults = new List<ValidationResult>(); bool valid = Validator.TryValidateObject(u, context, validationResults, true); if (!valid) { foreach (ValidationResult validationResult in validationResults) { ErrorMessage += validationResult.ErrorMessage + "<br>"; } } Result += JsonConvert.SerializeObject(u); return Page(); }


Result:

 

其實資料驗證這種東西,可以在前端( javascript 做) ,當然後端也要做,每次都要寫很多 code 去判斷

當如果頁面多就會變得很麻煩,現在等於就是 .Net 就內建一些方式讓你在設計 Model 的時候就可以制定規格

制定的好 code 也可以少寫很多


reference:

https://medium.com/medialesson/new-data-annotation-attributes-with-net-8-82d49134a2f4



當麻許的碎念筆記 2014 | Donma Hsu Design.