今天在一個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, true); if (!isValid) { return Content(string.Join("<br/>", results.Select(x => x.ErrorMessage))); } else { return Content("OK"); } }
執行結果:
Title 字段是必需的。
從此可以借助聲明式驗證讓代碼更漂亮。