Model Validation(模型验证)

时间:2023-02-21 19:38:29

Model Validation(模型验证)

前言

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

本文参考链接文章地址http://www.asp.net/web-api/overview/formats-and-model-binding/model-validation-in-aspnet-web-api

当客户端发送数据给你的Web API时,你通常希望在做其它处理之前先对数据进行验证。

Data Annotations——数据注解

在ASP.NET Web API中,你可以使用System.ComponentModel.DataAnnotations命名空间的注解属性来设置模型属性的验证规则。考虑以下模型:

Model Validation(模型验证)
public class Product
{
public int Id { get; set; } [Required]
public string Name { get; set; }
public decimal Price { get; set; } [Range(0,999)]
public double Weight { get; set; }
}
Model Validation(模型验证)

如果你曾在ASP.NET MVC中使用过模型验证,这看上去是类似的。Required注解属性说明Name属性必须不为空。Range注解属性说明Weight必须在0-999之间。

假设客户端发送了一个带有下列JSON表示的POST请求:

{ "Id":4, "Price":2.99, "Weight":5 }

你可以看出,客户端并未包含被标记成required的Name属性。当Web API将该JSON转换成Product实例时,它会根据这些验证注解属性对Product进行验证。在控制器动作中,你可以检查该模型是否有效:

Model Validation(模型验证)
public class ProductsController : ApiController
{
public HttpResponseMessage Post(Product product)
{
if (ModelState.IsValid)
{
// Do something with the product (not shown).
// 用product做一些事(未表示出来) return new HttpResponseMessage(HttpStatusCode.OK);
}
else
{
return new HttpResponseMessage(HttpStatusCode.BadRequest);
}
}
}
Model Validation(模型验证)

模型验证并不保证客户端数据是安全的。在应用程序的其它层面可能会需要附加验证(例如,数据层可能会强制外键约束)。

{"Id":4, "Name":"Gizmo"}

此处,客户端并未指定Price或Weight的值。JSON格式化器会将默认值(这里是零)赋给这些缺失的属性。

Under-Posting(递交不足)”:当客户端遗漏了某些属性时,便会发生“Under-posting”。例如,假设客户端发送如下:

Model Validation(模型验证)

此时模型的状态是有效的,因为零是这些属性的有效值。这是否是一个问题取决于你所处的场景。例如,在一个更新操作中,你可能希望区分出“零”与“未设置”。为了强迫客户端要设置一个值,将该属性构造成nullable(可空的),并设置Required注解属性:

[Required]
public decimal? Price { get; set; }

Over-Posting(过份递交)”:客户端也可能发送比期望还多的数据。例如:

{"Id":4, "Name":"Gizmo", "Color":"Blue"}

此处,JSON包含了Product模型中存在的属性(“Color”)。在这种情况下,JSON格式化器会简单地忽略该值(XML格式化器却不同)。若你的模型具有只读属性,Over-posting会产生问题。例如:

public class UserProfile
{
public string Name { get; set; }
public Uri Blog { get; set; }
public bool IsAdmin { get; set; } // uh-oh!(啊哦!)
}

如果你不想让用户对IsAdmin属性进行更新,并将其提升给管理员。最安全的策略是使用一个与允许客户端发送严格匹配的模型类:

Model Validation(模型验证)
public class UserProfileDTO
{
public string Name { get; set; }
public Uri Blog { get; set; }
// Leave out "IsAdmin"
// 略去了"IsAdmin"
}
Model Validation(模型验证)

Handling Validation Errors——处理验证错误

当验证失败时,Web API并不会自动地将错误返回给客户端。这取决于控制器动作对模型状态及响应进行适当的检查。

你也可以创建一个动作过滤器,以便在控制器动作被调用之前,检查模型的状态。以下代码演示了一个例子:

Model Validation(模型验证)
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;
using System.Web.Http.ModelBinding; public class ModelValidationFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
if (actionContext.ModelState.IsValid == false)
{
// Return the validation errors in the response body.
// 在响应体中返回验证错误
var errors = new Dictionary<string, IEnumerable<string>>();
foreach (KeyValuePair<string, ModelState> keyValue in actionContext.ModelState)
{
errors[keyValue.Key] = keyValue.Value.Errors.Select(e => e.ErrorMessage);
} actionContext.Response =
actionContext.Request.CreateResponse(HttpStatusCode.BadRequest, errors);
}
}
}
Model Validation(模型验证)

如果模型验证失败,此过滤器会返回一个含有验证错误的HTTP响应。在此情况下,不会调用控制器动作。

Model Validation(模型验证)
HTTP/1.1 400 Bad Request
Server: ASP.NET Development Server/10.0.0.0
Date: Fri, 20 Jul 2012 21:42:18 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 239
Connection: Close {
"product": [
"Required property 'Name' not found in JSON. Line 1, position 18."
], "product.Name": [
"The Name field is required."
], "product.Weight": [
"The field Weight must be between 0 and 999."
]
}
Model Validation(模型验证)

如果你正在使用CodePlex上最新版的Web API,可以使用HttpError类将验证错误返回给客户端。HttpError类在RC版(指Web API的预览版)中无效。

你可以将此过滤器全局性地运用于所有Web API控制器。在Application_Start方法中,将此过滤器添加到HttpConfiguration.Filters集合:

protected void Application_Start()
{
// ... GlobalConfiguration.Configuration.Filters.Add(new ModelValidationFilterAttribute());
}

另一种可选办法是,通过将此过滤器作为注解属性进行添加,你可以将它运用于个别控制器或控制器动作:

Model Validation(模型验证)
public class ProductsController : ApiController
{
[ModelValidationFilter]
public HttpResponseMessage Post(Product product)
{
// ...
}
}
Model Validation(模型验证)
 

上周热点回顾(12.16-12.22)

 

热点随笔:

· 暴力英语学习法 + 严格的目标管理 = 成功快速靠谱的学好英语Jesse Liu
· .NET平台技术体系梳理+初学者学习路径推荐+我们的愿景与目标际为软件事务所
· “不给力啊,老湿!”:RSA加密与破解Vamei
· 开发人员解决不熟悉领域技术难题总结AllEmpty
· 当你手头没有工作的时候你在做什么?饮鸩止渴
· 我是这么利用数据——对需求说不欢乐的财神
· 使用DotNetBar制作漂亮的WinFrom界面,自定义AgileEAS.NET SOA平台WinClient主界面魏琼东
· 跨浏览器开发工作小结Gof Lee
· 我是这么利用数据——小身材,大味道欢乐的财神
· 一个小程序引发的思考幕三少
· 【探讨】javascript事件机制底层实现原理叶小钗
· 谈谈小菜眼中的博客园(想法和建议)田园里的蟋蟀

热点新闻:

· 趣文:如果老婆和女朋友她们是程序
· 周鸿祎:把自己当成打工的,一辈子都是打工的
· 关于程序员的59条搞笑但却真实无比的编程语录
· 国外一机器人否认自己是机器人
· 编程不只是技术,高考应有计算机一席之地
· 窃听CPU的声音就可破译最复杂的密码
· 杭州27岁淘宝三皇冠女卖家涉嫌两项罪名被批捕
· 一个创业者眼中的2014(上):学会寄生,忘掉平台
· 雷军:两场对谈,夸我骂我都是为我好
· 雾霾笼罩下的中国各地:太空俯瞰清晰可见
· G1诞生内幕
· 66岁“技术宅”发明简易输入法

知识库热点文章:

· 揭示记忆力的真相
· 多研究些问题,少谈些主义
· 领域建模中的七种坏味道信息
· 云风:一个编程的*人
· 思考、学习新技术的原则和方式

 
 

Model Validation(模型验证)的更多相关文章

  1. Asp&period;Net Web API 2第十五课——Model Validation&lpar;模型验证&rpar;

    前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 本文参考链接文章地址htt ...

  2. webapi Model Validation 模型验证

    通常情况下,对于那些经常为别人提供数据接口的开发人员来说,对于调用方传递过来的参数都会有验证处理.例如: if (string.IsNullOrEmpty(entity.Name)) { //当姓名为 ...

  3. JSR 303 - Bean Validation 模型验证

    类是转载的,不知道转的哪里的. 此类依赖 JSR 303 – Bean Validation, Hibernate Validator. 代码不能直接运行.意会一下.自己改改. import com. ...

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

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

  5. &lt&semi;转&gt&semi;ASP&period;NET学习笔记之MVC 3 数据验证 Model Validation 详解

    MVC 3 数据验证 Model Validation 详解  再附加一些比较好的验证详解:(以下均为引用) 1.asp.net mvc3 的数据验证(一) - zhangkai2237 - 博客园 ...

  6. ASP&period;NET Core 中文文档 第四章 MVC(2&period;2)模型验证

    原文:Model Validation 作者:Rachel Appel 翻译:娄宇(Lyrics) 校对:孟帅洋(书缘) 在这篇文章中: 章节: 介绍模型验证 验证 Attribute 模型状态 处理 ...

  7. MVC遇上bootstrap后的ajax表单模型验证

    MVC遇上bootstrap后的ajax表单验证 使用bootstrap后他由他自带的样式has-error,想要使用它就会比较麻烦,往常使用jqueyr.validate的话只有使用他自己的样式了, ...

  8. Model Validation in ASP&period;NET Web API

    Model Validation in ASP.NET Web API 原文:http://www.asp.net/web-api/overview/formats-and-model-binding ...

  9. EMF学习,为了实现可扩展可自定义的模型验证 - 各种实现方法学习

    自: http://blog.csdn.net/javaman_chen/article/details/6057033 http://www.ibm.com/developerworks/cn/op ...

随机推荐

  1. ASP&period;NET MVC 3 网站优化总结&lpar;三&rpar;Specify Vary&colon; Accept-Encoding header

    继续进行 ASP.NET MVC 3 网站优化工作,使用 Google Page 检测发现提示 You should Specify Vary: Accept-Encoding header,The ...

  2. 用sessionStorage实现页面之间的数据传输

    1.sessionStorage主要含几种方法: //页面A:存放一个简单的字符串 sessionStorage.obj = '123'; //页面B:取到给obj var str = session ...

  3. 利用css3实现超出文本指定行数与省略号效果

    <style> .text1 {/*单行*/ width:200px; overflow:hidden; text-overflow:ellipsis; -o-text-overflow: ...

  4. poj 2528 线段树 离散化的小技巧

    题意:在墙上贴海报,海报可以互相覆盖,问最后可以看见几张海报思路:直接搞超时+超内存,需要离散化.离散化简单的来说就是只取我们需要的值来 用,比如说区间[1000,2000],[1990,2012] ...

  5. 浅谈JavaScript词法分析步骤

    JavaScript代码运行前有一个类似编译的过程即词法分析,词法分析主要有三个步骤: 分析参数 再分析变量的声明 分析函数声明 具体步骤如下: 函数在运行的瞬间,生成一个活动对象(Active Ob ...

  6. CF &num;404 &lpar;Div&period; 2&rpar; D&period; Anton and School - 2 &lpar;数论&plus;范德蒙恒等式&rpar;

    题意:给你一个由'('和')'组成的字符串,问你有多少个子串,前半部分是由'('组成后半部分由')'组成 思路:枚举这个字符串中的所有'('左括号,它左边的所有'('左括号的个数为num1,它的右边的 ...

  7. SpringMVC 快速入门

    SpringMVC 快速入门 SpringMVC 简介 SpringMVC是 Spring为展示层提供的基于Web MVC设计模式的请求驱动类型的轻量级Web框架,它的功能和Struts2一样.但比S ...

  8. Android艺术开发探索第四章——View的工作原理(下)

    Android艺术开发探索第四章--View的工作原理(下) 我们上篇BB了这么多,这篇就多多少少要来点实战了,上篇主席叫我多点自己的理解,那我就多点真诚,少点套路了,老司机,开车吧! 我们这一篇就扯 ...

  9. Linux 基本操作 (day2&rpar;

    一.用户的基本操作 1.添加和删除用户(管理员): useradd  用户名: useradd taibai passwd  用户名: passwd taibai [root@localhost ~] ...

  10. SpringBoot2&period;0WebFlux响应式编程知识总结