一、模型验证的作用

在ASP.NET Web API中,我们可以使用 System.ComponentModel.DataAnnotations 命名空间中的属性为模型上的属性设置验证规则。

一个模型验证栗子

using System.ComponentModel.DataAnnotations;
namespace MyApi.Models
{
public class Product
{
public int Id { get; set; }
[Required]
public string Name { get; set; }
public decimal Price { get; set; }
[Range(, )]
public double Weight { get; set; }
}
}

  和ASP.NET MVC中中的模型验证十分相似,上边的验证规则是:Name属性不能为空,Weight必须在0与999之间。关于验证属性的用法可以参考.NET MVC的验证属性。

客户端(没有必须的Name):

    <form action="api/Product" method="post">
Id:<input type="text" name="Id" value="4" /><br />
Price:<input type="text" name="Price" value="1.99" /><br />
Weight:<input type="text" name="Weight" value="2.99" /><br />
<input type="submit" value="Submit" />
</form>

控制器代码:

public class ProductsController : ApiController
{
public HttpResponseMessage Post(Product product)
{
if (ModelState.IsValid)
{
// Do something with the product (not shown).
  return new HttpResponseMessage(HttpStatusCode.OK);
}
else
{
  return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
}
}
}

当我们提交表格时,google中返回的内容如下

两个小问题:

“Under-Posting”:客户端提交的模型缺少字段,如果是[required]修饰的字段,ModelState不通过验证,如果是数字类型的,用0补充。

“Over-Posting”:客户端也可以发送更多的数据,JSON格式化器只是忽略此值(XML格式化程序也是如此)。

二 、WebApi中的处理验证错误

第一步  添加过滤器

验证失败时,Web API不会自动向客户端返回错误,这就需要控制器来做出适当的响应。我们可以创建action filter用于在Action执行之前检查模型状态。和MVC中的用法一样,代码显示了一个示例:

    public class ValidateModelAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
if (!actionContext.ModelState.IsValid)
{
//返回第一个异常的错误消息
actionContext.Response = actionContext.Request.CreateResponse(
HttpStatusCode.InternalServerError,
new { code = , msg = actionContext.ModelState.Values.First().Errors.First().ErrorMessage });
}
}
}

如果模型验证失败,则此过滤器返回包含验证错误的HTTP响应,这样就不再执行Action了。

第二步  使用过滤器

  如果我们想在全局使用这种方案,我们可以设置一个全局的过滤器,在配置阶段把上边的过滤器添加到 HttpConfiguration.Filters 集合中。

public static class WebApiConfig
{
  public static void Register(HttpConfiguration config)
{
config.Filters.Add(new ValidateModelAttribute());
}
}

  如果不想使用全局过滤器,我们也可以把filter设置为各个Controller或Action的属性:

public class ProductsController : ApiController
{
[ValidateModel]
public HttpResponseMessage Post(Product product)
{
// ...
}
}

这里主要总结了WebApi中的模型验证,了解更多可查看官网

Web API中的模型验证的更多相关文章

  1. Web API中的模型验证Model Validation

    数据注释 在ASP.NET Web API中,您可以使用System.ComponentModel.DataAnnotations命名空间中的属性为模型上的属性设置验证规则. using System ...

  2. .Net Core3.0 WEB API 中使用FluentValidation验证,实现批量注入

    为什么要使用FluentValidation 1.在日常的开发中,需要验证参数的合理性,不紧前端需要验证传毒的参数,后端也需要验证参数 2.在领域模型中也应该验证,做好防御性的编程是一种好的习惯(其实 ...

  3. .net core web api 默认的模型验证

    转载自 https://www.codercto.com/a/45938.html

  4. 【ASP.NET Web API教程】4.3 ASP.NET Web API中的异常处理

    原文:[ASP.NET Web API教程]4.3 ASP.NET Web API中的异常处理 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本系列教程,请先看前面的内 ...

  5. .NET Core WEB API中接口参数的模型绑定的理解

    在.NET Core WEB API中参数的模型绑定方式有以下表格中的几种: 微软官方文档说明地址:https://docs.microsoft.com/zh-cn/aspnet/core/web-a ...

  6. ASP.NET Core Web API中带有刷新令牌的JWT身份验证流程

    ASP.NET Core Web API中带有刷新令牌的JWT身份验证流程 翻译自:地址 在今年年初,我整理了有关将JWT身份验证与ASP.NET Core Web API和Angular一起使用的详 ...

  7. 【ASP.NET Web API教程】6.2 ASP.NET Web API中的JSON和XML序列化

    谨以此文感谢关注此系列文章的园友!前段时间本以为此系列文章已没多少人关注,而不打算继续下去了.因为文章贴出来之后,看的人似乎不多,也很少有人对这些文章发表评论,而且几乎无人给予“推荐”.但前几天有人询 ...

  8. Asp.Net Web API 2第十三课——ASP.NET Web API中的JSON和XML序列化

    前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 本文描述ASP.NET W ...

  9. ASP.NET Web API中的JSON和XML序列化

    ASP.NET Web API中的JSON和XML序列化 前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok ...

随机推荐

  1. P1508 Likecloud-吃、吃、吃

    数字金字塔3条路 f[i][j]=max(max(f[i-1][j],f[i-1][j-1]),f[i-1][j+1])+a[i][j]; #include<bits/stdc++.h> ...

  2. Codeforces1063D Candies for Children 【分类讨论】【暴力】

    题目分析: 首先要想两个暴力,一个的时间复杂度是$O(n^2)$,另一个是$O([\frac{n}{k}])$的. $n^2$的暴力可以枚举两段,一段有$i$个取两个的小朋友,一段有$j$个取两个的小 ...

  3. MT【259】2016天津压轴题之最佳逼近

    (2016天津压轴题)设函数$f(x)=(x-1)^3-ax-b,x\in R$, 其中$a,b\in R$(1)求$f(x)$的单调区间.(2)若$f(x)$存在极值点$x_0$,且$f(x_1)= ...

  4. 【hdu6186】CS Course(前缀后缀异或)

    2017ACM/ICPC广西邀请赛 重现赛1005CS Course 题意 给一个数列a,每次询问去掉第p个的与和.或和,异或和. 题解 预处理前缀和.后缀和即可. 但是当时想都没想就写了个线段树.线 ...

  5. SHELL 脚本小技巧

    脚本很简单,直接上功能介绍及脚本,可以做模板使用: 记录日志,记录脚本开始执行时间.结束时间 usage 函数,脚本需接参数执行,避免误执行,告诉用户,这个脚本的使用方法 加锁,创建锁文件,脚本不允许 ...

  6. 设置Linux防火墙

    设置 Linux 服务器防火墙脚本,Web_iptables.sh 通过内网可访问服务器所有开放端口 给跳板机开放sshd端口连接服务器 信任ip 所有端口均开放 开放部分端口供外部访问 #!/bin ...

  7. 使用Putty执行Rsync命令

    背景介绍:公司的文件服务器有多个,一个Master服务器,10个左右的Slave服务器. 当Master服务器中的文件更新之后,Slave服务器中的文件也必须做相对应的同步操作. 公司目前使用的Rsy ...

  8. UOJ277【清华集训2016】定向越野(计算几何,最短路)

    UOJ题目传送门 显然最优的路径只会经过若干条两个圆的公切线和若干段圆弧 为了方便,把起点终点看成两个半径为\(0\)的圆也行. 最烦的就是算两个圆的公切线了,一共有四条 对于靠外面的两条,我们把切线 ...

  9. 用Nifi 从web api 取数据到HDFS

    1. 全景图   2. 用ExecuteScript生成动态日期参数   为了只生成一个flowfile:       Groovy 代码: import org.apache.commons.io. ...

  10. MVC接收列表参数

    ASP.NET  MVC 表单参数如果有列表时要怎么写呢. 虽然很久不用MVC了,但几乎每次遇到一次就要研究一下.然后又忘了. 其实也明白这是未完全弄清楚表单参数的传递形式,如果明白了,就知道MVC为 ...