[.NET] 使用ValidationContext快速进行模型资料的验证
在进行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快速进行模型资料的验证的更多相关文章
- [.NET] 使用VALIDATIONCONTEXT快速进行模型资料的验证 》简单xml创建-json转xml
[.NET] 使用VALIDATIONCONTEXT快速进行模型资料的验证 在进行WebAPI功能开发的时候,一般传统的验证资料是否合法的方式,都是透过if/else的方式进行判断若是使用Valida ...
- asp.net core系列 45 Web应用 模型绑定和验证
一. 模型绑定 ASP.NET Core MVC 中的模型绑定,是将 HTTP 请求中的数据映射到action方法参数. 这些参数可能是简单类型的参数,如字符串.整数或浮点数,也可能是复杂类型的参数. ...
- Verification of Model Transformations A Survey of the State-of-the-Art 模型转换的验证 对现状的调查
模型驱动工程范式认为软件开发生命周期由工件(需求规范.分析和设计文档.测试套件.源代码)支持,这些工件是表示要构建的系统不同视图的模型.存在一个由模型转换驱动的(半)自动构造过程,从系统的抽象模型开始 ...
- [Asp.net MVC]Asp.net MVC5系列——在模型中添加验证规则
目录 概述 在模型中添加验证规则 自定义验证规则 伙伴类的使用 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列——第一个项目 [Asp.net MVC]Asp.net MVC5 ...
- Thinkphp命令行快速生成模型类方法
进去cmd,切换到项目根目录,也就是think文件所在目录,执行下面的指令可以生成index模块的blog模型类文件: >php think make:model index/Blog 生成的模 ...
- JVM重新认识(一)oop-klass模型--HSDB使用验证
一:oop-kclass模型 思考:我们平时写的java类编译成.class文件,JVM加载.class文件,那么加载.class文件之后在JVM中就是oop-kclass(C++)模型形式存在的. ...
- 关于MVC中模型model的验证问题
今天在做项目练习的时候发现,MVC中使用自带的模型验证时会提前显示在界面上,比如下面所示: 这是什么原因了,是因为我在表示get请求的action里面返回了其界面所显示使用的model,我们知道mvc ...
- YII 1.0模型标签与验证规则,前后台验证
model Admin.php model(),tabName()是固定格式 <?php /* 管理员模型 * ----------------------------------------- ...
- NancyFX 第七章 模型绑定和验证
任何优秀的框架,都能传递参数.在之前的路由章节,我们已经看到了如何在URL中传递参数. 能够传递简单的参数当然好,特别是在设计那些从数据库读取记录的API设计中.但是,很多情况下也是需要传递复杂对象. ...
随机推荐
- 垂直对齐:vertical-align:super属性
<p style=”vertical-align:super;”>垂直对齐<span>上标</span></p> <p>元素默认为块级元素, ...
- shell 按行读取文件的内容
test.py: #coding=utf- import subprocess compilePopen = subprocess.Popen('gcc haha',shell=True,stderr ...
- linux下的启停脚本
linux下的根据项目名称,进行进程的启停脚本 #!/bin/bash JAVA=/usr/bin/java APP_HOME=/opt/program/qa/wechat APP_NAME=prog ...
- [原]osg模型动画|骨骼动画
参考源码:osg的官方例子:osganimationviewer 首先制作一个带骨骼动画的模型 demo.FBX 这里面我们做了两个骨骼动画:1.open 2.close 下面开始在osg中使用 ...
- 【Redis】yum安装redis
1.yum直接安装就可以 yum install redis 2.Redis开启远程登录连接 redis默认只能localhost访问 .配置防火墙 开放端口6379 .在redis的配置文件/etc ...
- java,桶排序,冒泡排序,快速排序
1.桶排序: 百度百科:桶排序 (Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶子里.每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排 ...
- C#流程控制语句--分支语句(if,switch,三位运算符)
分支语句:判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的). 分支语句 if if(判断条件表达式) {//表达式结果为tu ...
- react component onClick 函数带参数
<div onClick={this.toggleTip(true)}></div> toggleTip = shouldShowTip => () => { th ...
- 某mac最简单调节亮度
说明 mac用户其实都可以使用 背景 很多人都说需要打补丁啊,或者修改什么的,我试过不管用.不如通过软件调节.. 正文 从appstore下载 Brightness Slider 即可,虽然不能达到系 ...
- 使用 dva 如何配置异步加载路由组件
来源:https://www.jianshu.com/p/69694013e36b----------------------------------------------------- 普通方式 ...