[.NET] 使用VALIDATIONCONTEXT快速进行模型资料的验证

在进行WebAPI功能开发的时候,一般传统的验证资料是否合法的方式,都是透过if/else的方式进行判断
若是使用ValidationContext,就可以省去很多自行撰写程式码的工作

要使用ValidationContext的验证方式很简单,我先用一个简单的例子来说明就可以呈现所需要的结果

1.首先先在专案中建立一个新的模型档案,并在模型档案中加入下面的程式码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class ValidModels
{
    /// <summary>
    /// 輸入資料的模型
    /// </summary>
    public class ValidInfoQuery
    {
        [Required]
        public string Name { getset; }
        public string Tel { getset; }
        public string Address { getset; }
        [Required]
        [Range(1, 130)]
        public int Age { getset; }
        [Required]
        public DateTime Birthday { getset; }
    }
 
    /// <summary>
    /// 回傳驗證結果的模型
    /// </summary>
    public class ValidInfoResult
    {
        public bool IsValid { getset; }
        public List<ValidItem> List { getset; }
        public class ValidItem
        {
            public IEnumerable<string> Field { getset; }
            public string Message { getset; }
        }
    }
}

  

在这个模型中,我们定义了要输入的资料模型,以及要回传的模型定义,在输入的模型ValidInfoQuery中,特别在"Name"、"Age"、"Birthday"三个栏位中,加上[Required]的属性。并且在"Age"的栏位中,加入[Range(1, 130)]的属性,代表Age的合法值在1到130之间

2.接着加入一个新的控制器"ValidController.cs",加入一个POST的方法,并将刚刚新增的模型,分别放入Input以及Output的参数

1
2
3
4
5
6
7
8
9
10
11
public class ValidController : ApiController
{
    /// <summary>
    /// 執行資料寫入的Post動作
    /// </summary>
    /// <param name="query"></param>
    public Models.ValidModels.ValidInfoResult Post(Models.ValidModels.ValidInfoQuery query)
    {
 
    }
}

  3.一般传统进行输入资料验证的方式,会采用下面的方式进行验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 傳統欄位驗證的寫法
 
// 驗證Name欄位
if (string.IsNullOrEmpty(query.Name))
{
    result.IsValid = false;
    result.List.Add(new Models.ValidModels.ValidInfoResult.ValidItem()
    {
        Field = new List<string> { "Name" },
        Message = "Name欄位必填"
    });
}
 
// 驗證Age欄位
if (query.Age > 130 || query.Age < 1)
{
    result.IsValid = false;
    result.List.Add(new Models.ValidModels.ValidInfoResult.ValidItem()
    {
        Field = new List<string> { "Age" },
        Message = "Age欄位必須在1與130之間"
    });
}

  但是这样的写法,一但Input模型的栏位增加的话,程式码也会相对的增加。也会影响程式码的效率。所以我们将验证的方式更改一下,改为ValidationContext进行验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 使用ValidationContext的驗證物件
// 定義ValidationContext的驗證物件
var context = new ValidationContext(query);
 
// 定義進行Validation回傳的訊息
var validationResults = new List<ValidationResult>();
 
// 進行驗證動作
bool isValid = Validator.TryValidateObject(query, context, validationResults, true);
 
// 將驗證結果進行處理,並回傳到指定的回傳物件中
result.IsValid = isValid;
result.List = validationResults.Select(c => new Models.ValidModels.ValidInfoResult.ValidItem()
                                {
                                    Field = c.MemberNames,
                                    Message = c.ErrorMessage
                                })
                                .ToList();

  

从上面的程式码可以很清楚的看到,只要定义出一个ValidationContext物件,并将要验证的模型资料传入,就可以在TryValidateObject的方法中,将所有资料不合法的栏位进行验证并得到结果

4.程式码完成后,我们实际执行刚刚的程式内容,并透过Swagger进行资料的输入。其中Name的栏位以及Age的栏位我刻意输入了不合法的内容

按下"Try it"之后,得到的结果如下图所示

可以看到,在结果的显示上,很清楚的列出"Name "与"Age"两个栏位是验证失败的,也显示了为什么发生错误的讯息内容

透过ValidationContext的验证方式,除了可以很快的完成模型资料的合法性验证外,也可以大量的减少撰写验证资料的程式码,提升程式效率与开发速度

范例程式下载
https://github.com/madukapai/maduka-WebAPI

》简单xml创建-json转xml

 
 1 public XmlDocument createXml()   {
 2      XmlDocument xmlDoc = new XmlDocument();
 3      string xmlJson = @"{
 4                               ""?xml"": {
 5                                 ""@version"": ""1.0"",
 6                                 ""@encoding"": ""gb2312""
 7                               },
 8                               ""weixin"": {
 9                                 ""token"":
10                                   {
11                                     ""@Tokenstr"": ""xxxxxxxxxxxxxxx"",
12                                     ""@Refreshtime"": ""2016/12/12 16:49:52""
13                                   },
14                                 ""ticket"":
15                                   {
16                                     ""@Ticketstr"": """",
17                                     ""@Refreshtime"": ""2016/12/8 14:56:34""
18                                   },
19                                 ""cardticket"":
20                                   {
21                                     ""@Ticketstr"": """",
22                                     ""@Refreshtime"": ""2016/11/10 9:51:52""
23                                   }
24                               }
25                             }";
26             xmlDoc = JsonConvert.DeserializeXmlNode(xmlJson);
27             xmlDoc.Save(path);
28             return xmlDoc;
29  }

[.NET] 使用VALIDATIONCONTEXT快速进行模型资料的验证 》简单xml创建-json转xml的更多相关文章

  1. [.NET] 使用ValidationContext快速进行模型资料的验证

    在进行WebAPI功能开发的时候,一般传统的验证资料是否合法的方式,都是透过if/else的方式进行判断若是使用ValidationContext,就可以省去很多自行撰写程式码的工作 要使用Valid ...

  2. asp.net core系列 45 Web应用 模型绑定和验证

    一. 模型绑定 ASP.NET Core MVC 中的模型绑定,是将 HTTP 请求中的数据映射到action方法参数. 这些参数可能是简单类型的参数,如字符串.整数或浮点数,也可能是复杂类型的参数. ...

  3. Verification of Model Transformations A Survey of the State-of-the-Art 模型转换的验证 对现状的调查

    模型驱动工程范式认为软件开发生命周期由工件(需求规范.分析和设计文档.测试套件.源代码)支持,这些工件是表示要构建的系统不同视图的模型.存在一个由模型转换驱动的(半)自动构造过程,从系统的抽象模型开始 ...

  4. [Asp.net MVC]Asp.net MVC5系列——在模型中添加验证规则

    目录 概述 在模型中添加验证规则 自定义验证规则 伙伴类的使用 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列——第一个项目 [Asp.net MVC]Asp.net MVC5 ...

  5. iOS开发——网络篇——JSON和XML,NSJSONSerialization ,NSXMLParser(XML解析器),NSXMLParserDelegate,MJExtension (字典转模型),GDataXML(三方框架解析XML)

    一.JSON 1.JSON简介什么是JSONJSON是一种轻量级的数据格式,一般用于数据交互服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) JSON的格式很像OC中的字典 ...

  6. iOS开发UI篇—使用嵌套模型完成的一个简单汽车图标展示程序

    iOS开发UI篇—使用嵌套模型完成的一个简单汽车图标展示程序 一.plist文件和项目结构图 说明:这是一个嵌套模型的示例 二.代码示例: YYcarsgroup.h文件代码: // // YYcar ...

  7. NancyFX 第七章 模型绑定和验证

    任何优秀的框架,都能传递参数.在之前的路由章节,我们已经看到了如何在URL中传递参数. 能够传递简单的参数当然好,特别是在设计那些从数据库读取记录的API设计中.但是,很多情况下也是需要传递复杂对象. ...

  8. 后盾网lavarel视频项目---模型一对多关联简单实例

    后盾网lavarel视频项目---模型一对多关联简单实例 一.总结 一句话总结: 在模型中定义一个方法来设置一对多关联:return $this->hasMany(Video::class); ...

  9. 第二篇MTV模型、基本命令、简单配置

    MTV模型.基本命令.简单配置 阅读目录(Content) MTV模型 基本命令 简单配置 MTV模型 Django的MTV分别代表: Model(模型):负责业务对象与数据库的对象(ORM) Tem ...

随机推荐

  1. USACO Arithmetic Progressions(暴力)

    题目请点我 题解: 这道题的题意是找出集合里全部固定长度为N的等差数列.集合内的元素均为P^2+q^2的形式(0<=p,q<=M).时间要求5s内.本着KISS,直接暴力. 可是后来竟超时 ...

  2. Oracle导入excel数据快速方法

    Oracle导入excel数据快速方法 使用PLSQL  Developer工具,这个可是大名鼎鼎的Oracle  DBA最常使用的工具.    在单个文件不大的情况下(少于100000行),并且目的 ...

  3. 为javascript设置默认参数值

    javascript(js)中如何为函数设置默认参数值,下面提供几种方法供参考. 第一种方法: function example(a,b){ var a = arguments[0] ? argume ...

  4. javascript基于原型的语言的特点

    一.基于原型的语言的特点 1 只有对象,没有类;对象继承对象,而不是类继承类. 2  “原型对象”是基于原型语言的核心概念.原型对象是新对象的模板,它将自身的属性共享给新对象.一个对象不但可以享有自己 ...

  5. 1067: 密室寻宝(find)

    #include <iostream> #include <iomanip> #include <cstdlib> #include <string> ...

  6. 默认的Sublime 3中没有Package Control

    https://packagecontrol.io/installation#st3 (官方) 原来Subl3安装Package Control很麻烦,现在简单的方法来了 一.简单的安装方法 使用Ct ...

  7. markdown table语法

    普通的表格 | 一个普通标题 | 一个普通标题 | 一个普通标题 | | ------ | ------ | ------ | | 短文本 | 中等文本 | 稍微长一点的文本 | | 稍微长一点的文本 ...

  8. 【Zookeeper】源码分析之请求处理链(三)之SyncRequestProcessor

    一.前言 在分析了PrepRequestProcessor处理器后,接着来分析SyncRequestProcessor,该处理器将请求存入磁盘,其将请求批量的存入磁盘以提高效率,请求在写入磁盘之前是不 ...

  9. js instanceof 实现原理

    function instanceof(left, right) { // 获得类型的原型 let prototype = right.prototype // 获得对象的原型 left = left ...

  10. Java AtomicBoolean (Java代码实战-008)

    值得一提的是,Java的AtomXXX类并不是使用了锁的方式进行同步,而是采用了一种新的理念,叫做CAS(Compare And Swap)CAS是一组CPU原语指令,用来实现多线程下的变量同步(原子 ...