爱上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 });
        }
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
简单性 Java看起来设计得很像C++,但是为了使语言小和容易熟悉,设计者们把C++语言中许多可用的特征去掉了,这些特征是一般程序员很少使用的。例如,Java不支持goto语句,代之以提供break和continue语句以及异常处理。Java还剔除了C++的操作符过载(overload)和多继承特征,并且不使用主文件,免去了预处理程序。因为Java没有结构,数组和串都是对象,所以不需要指针。Java能够自动处理对象的引用和间接引用,实现自动的无用单元收集,使用户不必为存储管理问题烦恼,能更多的时间和精力花在研发上。 面向对象 Java是一个面向对象的语言。对程序员来说,这意味着要注意其中的数据和操纵数据的方法(method),而不是严格地用过程来思考。在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和行为。每一对象是其状态和行为的封装。类是按一定体系和层次安排的,使得子类可以从超类继承行为。在这个类层次体系中有一个根类,它是具有一般行为的类。Java程序是用类来组织的。 Java还包括一个类的扩展集合,分别组成各种程序包(Package),用户可以在自己的程序中使用。例如,Java提供产生图形用户接口部件的类(java.awt包),这里awt是抽象窗口工具集(abstract windowing toolkit)的缩写,处理输入输出的类(java.io包)和支持网络功能的类(java.net包)。 分布性 Java设计成支持在网络上应用,它是分布式语言。Java既支持各种层次的网络连接,又以Socket类支持可靠的流(stream)网络连接,所以用户可以产生分布式的客户机和服务器。 网络变成软件应用的分布运载工具。Java程序只要编写一次,就可到处运行。 编译和解释性 Java编译程序生成字节码(byte-code),而不是通常的机器码。Java字节码提供对体系结构中性的目标文件格式,代码设计成可有效地传送程序到多个平台。Java程序可以在任何实现了Java解释程序和运行系统(run-time system)的系统上运行。 在一个解释性的环境中,程序开发的标准“链接”阶段大大消失了。如果说Java还有一个链接阶段,它只是把新类装进环境的过程,它是增量式的、轻量级的过程。因此,Java支持快速原型和容易试验,它将导致快速程序开发。这是一个与传统的、耗时的“编译、链接和测试”形成鲜明对比的精巧的开发过程。 稳健性 Java原来是用作编写消费类家用电子产品软件的语言,所以它是被设计成写高可靠和稳健软件的。Java消除了某些编程错误,使得用它写可靠软件相当容易。 Java是一个强类型语言,它允许扩展编译时检查潜在类型不匹配问题的功能。Java要求显式的方法声明,它不支持C风格的隐式声明。这些严格的要求保证编译程序能捕捉调用错误,这就导致更可靠的程序。 可靠性方面最重要的增强之一是Java的存储模型。Java不支持指针,它消除重写存储和讹误数据的可能性。类似地,Java自动的“无用单元收集”预防存储漏泄和其它有关动态存储分配和解除分配的有害错误。Java解释程序也执行许多运行时的检查,诸如验证所有数组和串访问是否在界限之内。 异常处理是Java中使得程序更稳健的另一个特征。异常是某种类似于错误的异常条件出现的信号。使用try/catch/finally语句,程序员可以找到出错的处理代码,这就简化了出错处理和恢复的任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值