zoukankan      html  css  js  c++  java
  • 爱上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 });
            }

    回到目录

  • 相关阅读:
    poj 1789 每个字符串不同的字母数代表两个结点间的权值 (MST)
    poj 1251 poj 1258 hdu 1863 poj 1287 poj 2421 hdu 1233 最小生成树模板题
    poj 1631 最多能有多少条不交叉的线 最大非降子序列 (LIS)
    hdu 5256 最少修改多少个数 能使原数列严格递增 (LIS)
    hdu 1025 上面n个点与下面n个点对应连线 求最多能连有多少条不相交的线 (LIS)
    Gym 100512F Funny Game (博弈+数论)
    UVa 12714 Two Points Revisited (水题,计算几何)
    UVa 12717 Fiasco (BFS模拟)
    UVa 12718 Dromicpalin Substrings (暴力)
    UVa 12716 && UVaLive 6657 GCD XOR (数论)
  • 原文地址:https://www.cnblogs.com/lori/p/4104509.html
Copyright © 2011-2022 走看看