Web API中的模型验证
一、模型验证的作用
在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中的模型验证的更多相关文章
- Web API中的模型验证Model Validation
数据注释 在ASP.NET Web API中,您可以使用System.ComponentModel.DataAnnotations命名空间中的属性为模型上的属性设置验证规则. using System ...
- .Net Core3.0 WEB API 中使用FluentValidation验证,实现批量注入
为什么要使用FluentValidation 1.在日常的开发中,需要验证参数的合理性,不紧前端需要验证传毒的参数,后端也需要验证参数 2.在领域模型中也应该验证,做好防御性的编程是一种好的习惯(其实 ...
- .net core web api 默认的模型验证
转载自 https://www.codercto.com/a/45938.html
- 【ASP.NET Web API教程】4.3 ASP.NET Web API中的异常处理
原文:[ASP.NET Web API教程]4.3 ASP.NET Web API中的异常处理 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本系列教程,请先看前面的内 ...
- .NET Core WEB API中接口参数的模型绑定的理解
在.NET Core WEB API中参数的模型绑定方式有以下表格中的几种: 微软官方文档说明地址:https://docs.microsoft.com/zh-cn/aspnet/core/web-a ...
- ASP.NET Core Web API中带有刷新令牌的JWT身份验证流程
ASP.NET Core Web API中带有刷新令牌的JWT身份验证流程 翻译自:地址 在今年年初,我整理了有关将JWT身份验证与ASP.NET Core Web API和Angular一起使用的详 ...
- 【ASP.NET Web API教程】6.2 ASP.NET Web API中的JSON和XML序列化
谨以此文感谢关注此系列文章的园友!前段时间本以为此系列文章已没多少人关注,而不打算继续下去了.因为文章贴出来之后,看的人似乎不多,也很少有人对这些文章发表评论,而且几乎无人给予“推荐”.但前几天有人询 ...
- 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 ...
- ASP.NET Web API中的JSON和XML序列化
ASP.NET Web API中的JSON和XML序列化 前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok ...
随机推荐
- 二分图最小点覆盖König定理的简单证明 (加入自己理解)
第一次更改:http://blog.sina.com.cn/s/blog_51cea4040100h152.html 讲的更细致 增广路:https://blog.csdn.net/qq_374572 ...
- 安卓Android基础四天
网页源码查看器 HttpURLConnection:用于发送和接受数据 ScrollView只能由一个孩子 消息机制的写法(***) anr Application not response 应用无响 ...
- 【刷题】BZOJ 1413 [ZJOI2009]取石子游戏
Description 在研究过Nim游戏及各种变种之后,Orez又发现了一种全新的取石子游戏,这个游戏是这样的: 有n堆石子,将这n堆石子摆成一排.游戏由两个人进行,两人轮流操作,每次操作者都可以从 ...
- HGOI 20190310 题解
/* 又是又双叒叕WA的一天... 我太弱鸡了... 今天上午打了4道CF */ Problem 1 meaning 给出q组询问,求下列函数的值$ f(a) = \max\limits_{0 < ...
- 【转】top命令输出解释以及load average 详解及排查思路
https://blog.csdn.net/zhangchenglikecc/article/details/52103737 昨天nagios报警warning,没来得及留下报警截图,nagios值 ...
- springAop @AfterReturning注解 获取返回值
@AfterReturning(returning="rvt", pointcut="@annotation(com.sinosoft.redis.cache.PutCa ...
- try语句的使用
C语言里try是一个语句或函数.其作用是是抛出错误用. 将有可能产生错误的语句括在一起,放入try语句块.如果在try语句块中发生异常,FlashPlayer会创建一个错误对象,并将该Error对象派 ...
- appium在不同类中使用的是同一个session
要这么做的起因: 测试testng框架的时候,不同类之间可以按照顺序执行,不会互相干扰.但是换成了appium,在A类中启动了session,初始化或者一些数据我仍然要用之前的session,那就不行 ...
- Unity 着色器基础知识
一.着色器基础知识 着色器通过代码模拟物体表面发生的事情,其实就是GPU中运行的一段代码. 着色器的类型: 顶点着色器.片元着色器.无光照着色器.表面着色器.图像特效着色器.计算着色器. 坐标空间: ...
- 高级组件——工具栏JToolBar
import javax.swing.*; import java.awt.*; public class Demo extends JFrame { public Demo() { setTitle ...