在.net Mvc開發時咱們通常都會選擇自帶的驗證機制。前端
咱們定義一個modelajax
public class ContainerModel { [Display(Name = "流水號")] public long Id { get; set; } [Display(Name = "委託業務流水號")] [Required(ErrorMessage = "委託業務流水號不能爲空")] public long ConsignId { get; set; } [Display(Name = "所屬人")] public long? OwnerId { get; set; } }
控制器,用ModelState.IsValid進行驗證,ExpendErrors是一個拓展方法,獲取驗證失敗的字段json
public ActionResult Create(ContainerModel model) { if (ModelState.IsValid) { //... } else { log.Warn("失敗,數據不完整-" + this.ExpendErrors()); return Json(...); } } }
咱們都知道,當從前端頁面傳入參數時,ConsignId字段是必須傳的,可是 Id和OwnerId呢?後端
OwnerId是可空類型,前端固然能夠不傳參數,或者傳一個空值的參數也能夠,驗證經過。測試
Id是不可空int類型,咱們能夠測試一下:ui
$.ajax({ type: "Post", url: "Create", data: { Id:0, ConsignId:10, OwnerId:1, }, success: function (result) { } }, "json");
OK,驗證經過this
$.ajax({ type: "Post", url: "Create", data: { ConsignId:10, OwnerId:1, }, success: function (result) { } }, "json");
OK,驗證也經過url
$.ajax({ type: "Post", url: "Create", data: { Id:, ConsignId:10, OwnerId:1, }, success: function (result) { } }, "json");
這時候就不能經過了,監控ExpendErrors獲得Id字段是必須的,斷點到控制器Create方法,看到傳過來的Model.Id=0也是有值的,這就奇怪了,明明有值的,也沒設置Required驗證,爲何就通不過了呢?spa
原來,是我沒有理解驗證機制的原理,驗證機制是發生在前端參數轉化爲後端model屬性時候發生的,也就是執行目標Action方法以前,model的Id爲不可空的Int類型,而參數傳遞了一個空值,因此驗證不一樣過。解決辦法就是:要麼不傳該參數,要傳就傳有初始化值的參數。.net