最近在看 .Net8 新功能,發現 對於 System.ComponentModel.DataAnnotations 增加了許多的擴充
變得方便許多,今天就來簡單的測試一下
今天主要測試幾個常用的 type,很簡單的 class 分別設定如下
using System.ComponentModel.DataAnnotations;
namespace CodeLab.Models
{
public class User
{
///
/// 只能四個字
///
[StringLength(maximumLength:4,MinimumLength =4, ErrorMessage = "Id錯誤:只能四個字"),Required(ErrorMessage ="Id不可以空白")]
public string Id { get; set; }
///
/// string 僅能接受 有限的選項
///
[AllowedValues("男", "女", "未知", ErrorMessage = "Gender錯誤:男,女,未知"), Required(ErrorMessage = "Gender不可以空白")]
public string Genger { get; set; }
///
/// string array 僅能接受有限的選線
///
[AllowedValues("睡覺", "電影", "其他", ErrorMessage = "Hobbies錯誤"), Required(ErrorMessage = "Hobbies 不可為空")]
public string[] Hobbies {get;set;}
///
/// 有限的範圍
///
[Range(1000,20000,ErrorMessage ="Salary錯誤") , Required(ErrorMessage = "Salary 不可為空")]
public decimal Salary { get; set; }
}
}
接下來就是在使用端的時候怎麼進行驗證
.cshtml 的部分
<form method="post">
<input name="id" placeholder="Id" class="form-control" /><br />
<select name="gender" class="form-control">
<option value="男">男</option>
<option value="女">女</option>
<option value="故意出錯">故意出錯</option>
<option value="其他">其他</option>
</select><br />
<input name="salary" placeholder="Salary" type="number" class="form-control" /><br />
<select name="hobby" multiple class="form-control">
<option value="睡覺">睡覺</option>
<option value="電影">電影</option>
<option value="故意出錯">故意出錯</option>
<option value="其他">其他</option>
</select><br />
<button asp-page-handler="Save1" class="btn btn-primary">Save</button>
</form>
<div>
Result:<br />
@Html.Raw(Model.Result)
</div>
<div style="color:red">
Error Message:<br />
@Html.Raw(Model.ErrorMessage)
</div>
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 validationResults = new List();
bool valid = Validator.TryValidateObject(u, context, validationResults, true);
if (!valid)
{
foreach (ValidationResult validationResult in validationResults)
{
ErrorMessage += validationResult.ErrorMessage + "
";
}
}
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