爱上MVC系列~前端验证与后端数据有效性验证
有一句话,在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 }); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
2012-11-17 架构之旅~底层提供一个统一的GetModel()的重要性