有一句話,在10年前就是真理,到現在也一直都是,“前端驗證可以沒有,但后端驗證必須要有”,這句話相信大家都沒有意見吧,前端驗證一般指通過JS方式實現的,友好的,個性的驗證方式,而后端驗證是指從表單提交過來,要進行入庫之前的,數據有效性的驗證,它不需要有美麗的外表,它需要有的僅僅是“有效”!
下面我將到MVC環境里的前端驗證和后端驗證作一個詳細的說明,一個使用上的說明。
前端驗證(KnockoutJs實現)
//創建訂單使用knockoutJs var CreateOrder = function () { var self = this; self.productid = ko.observable().extend({ required: true }); self.productname = ko.observable().extend({ required: true }); self.username = ko.observable().extend({ required: true }); self.price = ko.observable().extend({ required: true, min: { params: 1, message: "價格要是大於(0)的整數!" } }); self.count = ko.observable().extend({ required: true, min: { params: 1, message: "您最少也要買一個吧!" }, max: { params: 100, message: "最大一次只能買(100)個!" } }); self.Do = function () {//ko方法名需要是大寫的 self.errors = ko.validation.group(self); if (self.isValid()) { $.ajax({ url: "/order/doOrder", type: "POST", data: { productid: self.productid(), productname: self.productname(), price: self.price(), count: self.count(), username: self.username() }, success: function (data) { if (data.code == 1) { location.href = location.href; } else alert(data.code); } }) } else { self.errors.showAllMessages(); } } } ko.applyBindings(new CreateOrder());
后端驗證(數據實體有效性驗證和ViewModel業務規則驗證)
在這里多說兩句,數據實體有效性驗證是指和數據表相關的驗證規則,如你的UserName字段長度為128字符,那么,你的實體驗證的長度就是128,而ViewModel業務規則驗證是指針對具體業務設計的視圖模型,如用戶注冊模塊,在這個模塊里,你的UserName被產品經理規則為50個字符,那么,你的這個業務規則驗證的長度就是50,當然,你的其它業務可能也用到了UserName字段,而它的業務規則當然可以不同,這就是有效性和業務規則。
下面代碼是一個返回Json結果的Post請求方法,代碼如下
public JsonResult DoOrder(int productid, string username, string productname, decimal price, int count) { var entity = new Entity.Order_Info { TotalPrice = price * count, UserId = userid, UserName = username, AddDate = DateTime.Now, Info = "用戶下單", Order_Detail = new List<Order_Detail> { new Order_Detail { Count = count, ProductId = productid, ProductName = productname, SalePrice = price } } }; if (productid <= 0) { ModelState.AddModelError("ProductId", "商品ID不合法..."); } #region 在action里拼接ModelState錯誤消息 var errors = new StringBuilder(); foreach (string key in ViewData.ModelState.Keys) { ModelState modelState = ViewData.ModelState[key]; foreach (ModelError error in modelState.Errors) { errors.Append(error.ErrorMessage + ","); } } #endregion if (entity.IsValid && ModelState.IsValid) orderService.DoOrder(entity); else return Json(new { code = entity.GetRuleViolationMessages() + errors }); return Json(new { code = 1 }); }