.net Mvc驗證的坑

在.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

相關文章
相關標籤/搜索