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

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

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

public class ValidModels
{
/// <summary>
/// 輸入資料的模型
/// </summary>
public class ValidInfoQuery
{
[Required]
public string Name { get; set; }
public string Tel { get; set; }
public string Address { get; set; }
[Required]
[Range(1, 130)]
public int Age { get; set; }
[Required]
public DateTime Birthday { get; set; }
} /// <summary>
/// 回傳驗證結果的模型
/// </summary>
public class ValidInfoResult
{
public bool IsValid { get; set; }
public List<ValidItem> List { get; set; }
public class ValidItem
{
public IEnumerable<string> Field { get; set; }
public string Message { get; set; }
}
}
}

  

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

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

public class ValidController : ApiController
{
/// <summary>
/// 執行資料寫入的Post動作
/// </summary>
/// <param name="query"></param>
public Models.ValidModels.ValidInfoResult Post(Models.ValidModels.ValidInfoQuery query)
{ }
}

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

// 傳統欄位驗證的寫法

// 驗證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进行验证

// 使用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

[.NET] 使用ValidationContext快速进行模型资料的验证的更多相关文章

  1. [.NET] 使用VALIDATIONCONTEXT快速进行模型资料的验证 》简单xml创建-json转xml

    [.NET] 使用VALIDATIONCONTEXT快速进行模型资料的验证 在进行WebAPI功能开发的时候,一般传统的验证资料是否合法的方式,都是透过if/else的方式进行判断若是使用Valida ...

  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. Thinkphp命令行快速生成模型类方法

    进去cmd,切换到项目根目录,也就是think文件所在目录,执行下面的指令可以生成index模块的blog模型类文件: >php think make:model index/Blog 生成的模 ...

  6. JVM重新认识(一)oop-klass模型--HSDB使用验证

    一:oop-kclass模型 思考:我们平时写的java类编译成.class文件,JVM加载.class文件,那么加载.class文件之后在JVM中就是oop-kclass(C++)模型形式存在的. ...

  7. 关于MVC中模型model的验证问题

    今天在做项目练习的时候发现,MVC中使用自带的模型验证时会提前显示在界面上,比如下面所示: 这是什么原因了,是因为我在表示get请求的action里面返回了其界面所显示使用的model,我们知道mvc ...

  8. YII 1.0模型标签与验证规则,前后台验证

    model Admin.php model(),tabName()是固定格式 <?php /* 管理员模型 * ----------------------------------------- ...

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

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

随机推荐

  1. AI外包 人工智能外包 长年承接人工智能项目 北京动点软件

    人工智能artificial intelligence,AI是科技研究中最热门的方向之一.像 IBM.谷歌.微软.Facebook  和亚马逊等公司都在研发上投入大量的资金.或者收购那些在机器学习.神 ...

  2. Poj2018 Best Cow Fences

    传送门 题目大意就是给定一个长度为 n 的正整数序列 A ,求一个平均数最大的,长度不小于 L 的子序列. 思路: 二分答案. Code: #include<iostream> #incl ...

  3. psycopg2+postgis+pgAdmin4

    基于docker的postgres 部署见这篇 https://www.cnblogs.com/xuanmanstein/p/7742647.html 连接数据库 import psycopg2cla ...

  4. Jenkins 配置邮件通知步骤

    Jenkins 配置邮件通知前言 可以在Jenkins 中配置邮件通知,比如在构建失败时发送邮件通知项目组来及时修复问题. Jenkins 邮件通知功能的插件主要包括: Mailer Plugin ( ...

  5. 关于requestAnimationFrame与setInterval的一点差异

    requestAnimationFrame与setInterval都可以实现循环触发事件,但是setInterval是基于时间的,而requestAnimationFrame是基于帧数的,在我的一次开 ...

  6. LCSS最长公共子序列算法

    0.论文基本介绍以及相关内容 分析移动用户位置的相似性,提取移动用户的相似路径在出行路径预测.兴趣区域发现.轨迹聚类.个性化路径推荐等领域具有广泛的应用. 重点:利用移动用户定位数据找到合适轨迹的表示 ...

  7. SQLyog 连接主机的时候出现错误

    这个 连接主机的时候出现: 这个时候打开cmd 找到mysql 的bin目录 输入 mysqld  -nt -remove  即可   直接登录,注意这里的d代表的是服务端 接下来就可以不用输入密码直 ...

  8. JDK8下Object类源码理解

    JDK8中Object类提供的方法: package java.lang; /** * Class {@code Object} is the root of the class hierarchy. ...

  9. for 循环常见内置参数

    系统相关的信息模块: import sys sys.argv 是一个 list,包含所有的命令行参数. sys.stdout sys.stdin sys.stderr 分别表示标准输入输出,错误输出的 ...

  10. Java的四个标记接口:Serializable、Cloneable、RandomAccess和Remote接口

    一.概述 标记接口是一些没有属性和方法的接口,也是一种设计思想.Java中的一个标记接口表示的的是一种类的特性,实现了该标记接口的类则具有该特性.如实现了Serializable接口的类,表示这个类的 ...