5.ASP.NET全栈开发之在Vue中使用前端校验(二)

在全栈开发系列第三篇的时候有讲到使用Vue进行前端验证。在那一篇博文里,详细讲了如何搭建 vuefluentvalidator.js 的过程,并最终把它从需要(实体和实体验证器)到 直接使用,很显然,它很小巧的胜任了工作。(首先声明,这个vuefluentvalidator.js是我上周末也就是7月15号才开始构思和编写的,而我最开始的目的是希望它能轻松完成表单的校验工作,但没想过许多复杂多变的情况。所以这期间出现了多次更改和修正)。目前我已将它上传至github,网址为:https://github.com/gxqsd/vuefluentvalidator。如果你有什么更好的建议,我们可以一起修正。

回到正题,上一篇结束时,我们已经能让他成功跑起来了。但由于上一篇内容过多,所以还没来得及介绍下如何使用。

首先我们来看一个例子。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script type="text/javascript" src="vue.js"></script>
    <script src="vuefluentvalidator.js"></script>
</head>

<body>
    <div id="box">
        <form action="https://www.baidu.com">
            <div>
                <input type="text" v-model="model.name">
                <span>{{model.error.name}}</span>
            </div>
            <div>
                <input type="text" v-model="model.age">
                <span>{{model.error.age}}</span>
            </div>
            <input type="submit" value="提交" @click="submit({ev:$event})">
        </form>
    </div>
    <script>
        let vm = new Vue({
            el: ‘#box‘,
            data: {
                validator: new Validator({
                    model: {
                        name: undefined,
                        age: undefined,
                        address: {
                            home: undefined,
                            phone: undefined
                        }
                    },
                    rule: function (than) {
                        than.ruleFor("name")
                            .NotEmpty()
                            .WithMessage("名称必填")
                            .MinimumLength(5)
                            .WithMessage("最短长度为5");
                        than.ruleFor("age")
                            .NotEmpty()
                            .WithMessage("年龄必须")
                            .Number(0, 100)
                            .WithMessage("必须在0-100岁之间");
                    }
                }),
            },
            methods: {
                submit: function ({ ev }) {

                    if (this.validator.passValidation()) {
                        return;
                    }

                    ev.preventDefault();

                    this.validator.validation(ev.target);
                }
            },
            computed: {
                model: {
                    get: function () {
                        return this.validator.model;
                    }
                }
            }
        });
    </script>
</body>

</html>

在这个html页面里,我们引入了vue.js 和 vuefluentvalidator.js。

使用vuefluentvalidator 只需要在data 里 new 一个Validator 。Validator 有两个参数

第一个是要验证的数据,他可以是一个JSON对象,或者是一个实体对象 ClassName ,实际上我们可以将整个data的数据放入进去。我们传入进去的数据会被创建在其内部的model中,也就是说我们只需要通过validator.model 就能访问我们传进去的数据。

第二个参数则是一个回调函数,他是用来配置验证规则的函数。

回调函数默认有一个参数,在validator内部调用时会将this传进来,所以这个参数也就是validator本身。

通过这个回调函数的参数than,我们就可以进行验证规则的配置。

目前内置了六种验证规则。他们分别是

NotEmpty        非空验证,该方法无参数。

MinimumLength      最小长度验证,有一个参数,设置最小长度

MaximumLength     最大长度验证,有一个参数,设置最大长度

Length          长度范围验证,有2个参数,分别是最小长度和最大长度

Must           自定义验证,有一个参数,回调函数,回调函数会默认传入一个参数validator.model 就是我们在new validator的时候传进去的数据

Number         整数验证,有2个参数,分别是整数的最小值和最大值。默认值是Number.MinValue和Number.MaxValue

为什么没有邮箱验证之类的呢?实际上这些东西1是可以自定义,2是表单自带的type="email"是一个可靠验证。如果你有什么好的意见可以与我联系。

在配置了每一个验证规则后,我们可以通过WithMessage("errorMessaeg")设置错误消息。

而WithMessage后又可以继续为同一字段配置其他验证规则。

以上内容是介绍上篇博文结束后的使用方法。

今天,我想到在讲这一篇前端验证之前,我曾经写过两篇关于服务端验证的内容,其中有讲到

在实体

Person中存在一个复杂类型Address

public class Person
    {
        /// <summary>
        /// 姓名
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// 年龄
        /// </summary>
        public int Age { get; set; }
        /// <summary>
        /// 性别
        /// </summary>
        public bool Sex { get; set; }

        /// <summary>
        /// 地址
        /// </summary>
        public Address Address { get; set; }
    }
 public class Address
    {
        public string Home { get; set; }

        public string Phone { get; set; }
    }

我们在为Person设置Address的验证规则时,使用了SetValidator方式。

public class PersonValidator : AbstractValidator<Person>
    {
        public PersonValidator()
        {
            this.RuleFor(p => p.Name)
                .NotEmpty()
                .WithMessage("姓名不能为空");

            this.RuleFor(p => p.Age)
                .NotEmpty()
                .WithMessage("年龄不能为空");

            this.RuleFor(p => p.Address)
                .SetValidator(new AddressValidator());

        }
    }

那么如果我们的对象。

model: {
                        name: undefined,
                        age: undefined,
                        address: {
                            home: undefined,
                            phone: undefined
                        }
                    }

我们该是否也希望这样设置?

在我分析了后认为在前端js中这种方式不适合,原因是,我们为了简单而省略了验证器,而如果这样的使用方式会让我们需要定义一个AddressValidator。即使你说我们用一个Validator来代替,那也会让代码结构变成

than.ruleFor("name")
                            .NotEmpty()
                            .WithMessage("名称必填")
                            .MinimumLength(5)
                            .WithMessage("最短长度为5");
                        than.ruleFor("age")
                            .NotEmpty()
                            .WithMessage("年龄必须")
                            .Number(0, 100)
                            .WithMessage("必须在0-100岁之间");
                        than.ruleFor("address")
                            .setValidator(new Validator({
                                model: {
                                    home: undefined,
                                    phone: undefined
                                }, rule: function (than) {
                                    than.ruleFor("home")
                                        .NotEmpty()
                                        .WithMessage("家庭住址不能为空");
                                    than.ruleFor("iphone")
                                        .NotEmpty()
                                        .WithMessage("家庭电话不能为空");
                                }
                            }));

我认为这样的写法,简直糟糕透了,意味着重复又重复。看起来一点都不简洁了,甚至有点麻烦。

于是我想到了另一种写法

                    rule: function (than) {
                        than.ruleFor("name")
                            .NotEmpty()
                            .WithMessage("名称必填")
                            .MinimumLength(5)
                            .WithMessage("最短长度为5");
                        than.ruleFor("age")
                            .NotEmpty()
                            .WithMessage("年龄必须")
                            .Number(0, 100)
                            .WithMessage("必须在0-100岁之间");
                        than.ruleFor("address.home")
                            .NotEmpty()
                            .WithMessage("家庭住址不能为空");
                        than.ruleFor("address.phone")
                            .NotEmpty()
                            .WithMessage("家庭电话不能为空");
                    }

咱们key不是叫address吗?那我们要设置address对象的属性的时候直接address.propertyName 这样是不是又简单了一些?

于是我完成了vuefluentvalidator内部的修改。现我已将他放置在 https://github.com/gxqsd/vuefluentvalidator 你可以下载下来看看有何不同或有何问题,方便我们一起改进。

原文地址:https://www.cnblogs.com/Gxqsd/p/9343421.html

时间: 2024-08-17 14:31:39

5.ASP.NET全栈开发之在Vue中使用前端校验(二)的相关文章

物联网的全栈开发之路

本文由嵌入式企鹅圈原创团队成员-华南师范大学物联网创新中心黄鑫执笔. 两年前我还一直专注在android系统定制领域的研究,对物联网关注比较少,尽管我个人对智能家居的概念和场景体验也比较熟悉.真正引起我注意的是有一次在车上,听到电视广播说打开蓝牙,用手机摇一摇就可以摇到红包,我就觉得这个场景很棒,然后就知道了ibeacon和微信摇一摇周边,知道了微信硬件平台和物联网的发展已经深入渗透到我们的生活了.尽管我觉得自己进入物联网不算早,但是考虑到传统电子行业都有升级到物联的需求,加上自身在嵌入式和AP

Python全栈开发之21、django

http://www.cnblogs.com/wupeiqi/articles/5237704.html http://www.cnblogs.com/wupeiqi/articles/5246483.html http://www.cnblogs.com/yuanchenqi/articles/5786089.html 基本配置 一 常用命令 django-admin startproject sitename python manage.py runserver 0.0.0.0 python

Python全栈开发之17、tornado和web基础知识

一.web基础知识 学习web框架之前,先来看一下web基础知识,首先要明白其本质就是socket,用户对应一个socket客户端,但是如果从socket开始开发web应用程序那么效率太了,正确的做法是底层socket处理代码由专门的服务器软件实现,而对于真实开发中的python web程序来说也是一般会分为两部分:服务器程序和应用程序.服务器程序负责对socket服务器进行封装,并在请求到来时,先经过web服务器,对请求的各种数据进行整理封装.之后web服务器将封装好的数据传递给应用程序,应用

Python全栈开发之 Mysql (一)

一: 1.什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库别说我们在写程序的时候创建的database就是一个数据库 2.什么是 MySQL.Oracle.SQLite.Access.MS SQL Server等 ? 他们均是一个软件,但是都有2个主要的功能 1.将数据保存到文件或内存 2.接受待定的命令,然后对文件进行相应的操作如果有了以上软件,无须自己再去创建文件和文件夹,而是直接传递 命令 给上述软件,让其来进行文件操作,他们统称为数据库管理系统(DBM

Python全栈开发之Django基础

[TOC] No.1 MVC&MTV MVC M全拼为Model,主要封装对数据库层的访问,对数据库中的数据进行增.删.改.查操作 V全拼为View,用于封装结果,生成页面展示的html内容 C全拼为Controller,用于接收请求,处理业务逻辑,与Model和View交互,返回结果 MTV M全拼为Model,与MVC中的M功能相同,负责和数据库交互,进行数据处理 V全拼为View,与MVC中的C功能相同,接收请求,进行业务处理,返回应答 T全拼为Template,与MVC中的V功能相同,负

Python全栈开发之Django进阶

No.1 静态文件处理 项目中CSS.JS.图片都属于静态文件,一般会将静态文件存到一个单独目录中,便于管理,在HTML页面调用时,需要指定静态文件的路径,Django提供了一种解析静态文件的机制,文件可以放在项目目录下,也可以放在应用目录下 在mysite/setting.py设置文件的物理路径 STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), ] 在static目录下创建css.js.

python全栈开发之pycharm2016软件注册码_Day1

pycharm软件下载地址 https://www.jetbrains.com/pycharm/ pycharm 2016 注册码 1 43B4A73YYJ-eyJsaWNlbnNlSWQiOiI0M0I0QTczWVlKIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNzaWduZWVOYW1lIjoiIiwiYXNzaWduZWVFbWFpbCI6IiIsImxpY2Vuc2VSZXN0cmljdGlvbiI6IkZvciBlZHVjYXRpb25hbCB1c2U

Python全栈开发之9、面向对象、元类以及单例

前面一系列博文讲解的都是面向过程的编程,如今是时候来一波面向对象的讲解了 一.简介 面向对象编程是一种编程方式,使用 “类” 和 “对象” 来实现,所以,面向对象编程其实就是对 “类” 和 “对象” 的使用.类就是一个模板,模板里可以包含多个方法(函数),方法里实现各种各样的功能,,对象则是根据模板创建的实例,通过实例,对象可以执行类中的方法,每个对象都拥有相同的方法,但各自的数据可能不同. 二.类.对象和方法 在Python中,定义类是通过class关键字,class后面紧接着是类名,类名通常

Python全栈开发之13、CSS

一.css简介 CSS 是 Cascading Style Sheets的缩写,用来设计网页的样式布局,以及大小来适应不同的屏幕等,使网页的样式和网页数据分离, 二.导入css 导入css有4种方式: 1.行内式          行内式是在标记的style属性中设定CSS样式.这种方式没有体现出CSS的优势,不推荐使用. 2.嵌入式          嵌入式是将CSS样式集中写在网页的<head></head>标签对的<style></style>标签对中