標籤:
今天在一個ASP.NET MVC Controller Action中寫代碼時,需要對ViewModel的欄位進行驗證。但這個Action處理的是手工編寫的ajax請求(不是表單提交),無法使用ASP.NET MVC Validation功能。
MVC Action範例程式碼如下:
public async Task<ActionResult> Save(int? postId, PostModel post){ //驗證post的屬性,比如Titile不可為空}
按照以前的寫法,就要寫if語句進行判斷:
public async Task<ActionResult> Save(int? postId, PostModel post){ if(string.IsNullOrEmpty(post.Title)) { return Content("Title 欄位是必需的。"); }}
但今天在聲明式驗證的美麗身姿的誘惑下,再也不想寫這樣的累贅代碼,於是採取行動,作出改變。
聲明式驗證只需要在要驗證的ViewModel的欄位上加上相應的聲明,比如針對文中的樣本:
public class PostModel{ [Required] public string Title { get; set; }}
但現在的代碼情境需要手工觸發這個驗證並且拿到驗證結果,那如何?呢?
。。。
後來在網上找到瞭解決方法——Manual Validation with Data Annotations。
只需調用 System.ComponentModel.DataAnnotations.Validator.TryValidateObject() 就能實現,樣本實現代碼如下:
public async Task<ActionResult> Save(int? postId, PostModel post){ var validationContext = new ValidationContext(post); var results = new List<ValidationResult>(); var isValid = Validator.TryValidateObject(post, validationContext, results); if (!isValid) { return Content(string.Join("<br/>", results.Select(x => x.ErrorMessage))); } else { return Content("OK"); } }
執行結果:
Title 欄位是必需的。
從此可以藉助聲明式驗證讓代碼更漂亮。
C#中手工進行聲明式驗證,從此遠離if驗證