详解.NET Model ValidationAttribute的使用

如题所述

第1个回答  2024-09-19
一、简介

ValidationAttribute 验证特性一般用来验证数据的格式,范围,是否必填等,我们通过它的子类特性 Range、Required 等特性可以轻松实现对数据的验证。但是对于一些特殊需要的特性,系统自带的特性局限性很大,我们也可以自定义扩展需要的特性。 ?

二、ASP.NET 应用

ValidationAttribute 应用在 ASP.NET MVC 中是常用得,用于对 HTPP Request 参数字段得校验,不通过得会返回 400 提示给调用方。接下通过一个简单例子进行说明一下,例子使用得是 .NET Web API 。

2.1 Model

首先定义一个 request model 添加一些字段,如 Name 打上 Required、MinLength、MaxLength 这样的标记进行限制

public?class?PersonalRequest{????public?int?Id?{?get;?set;?}????[Required]????[MinLength(2),?MaxLength(20)]????public?string?Name?{?get;?set;?}????public?string?Sex?{?get;?set;?}????[Required]????[MinLength(2),?MaxLength(20)]????public?string?Address?{?get;?set;?}}

2.2 Controller

定义完 request ?model 后,创建一个 ?API ,将上一步定义的 request model 作为参数。此时在 request ?model 字段上打的 ?Required、MinLength、MaxLength 标记,是没有任何作用的。

[HttpPost][Route("WebAPIApply")]public?IActionResult?WebAPIApply(PersonalRequest?request){????return?Ok();}

2.4 Filter

为了让 request ?model 字段上打的 ?Required、MinLength、MaxLength 标记生效, MVC 中需要使用到 Filter 。代码如下

public?class?ModelValidateFilter?:?IAsyncActionFilter{????public?async?Task?OnActionExecutionAsync(ActionExecutingContext?context,?ActionExecutionDelegate?next)????{????????if?(!context.ModelState.IsValid)????????{????????????var?allErrors?=?context.ModelState.Values.SelectMany(v?=>?v.Errors);????????????var?message?=?string.Join("?|?",?allErrors.Select(e?=>?e.ErrorMessage));????????????context.Result?=?new?JsonResult(new?{?results?=?allErrors?});????????}????????await?next();????}}

2.5 注册

Filter 创建完成后,需要注册一下,这里我们使用全局模式。如下

builder.Services.AddMvc(opt?=>{????opt.Filters.Add(new?ModelValidateFilter());});

2.6 验证

程序创建完成后,调用 API 验证一下,如下对 Name 分别赋值了 D Da。 可以看到当是 D 的时候,字段长度为 1 ,filter 对 request ?model 进行了正确的校验

三、直接验证实例

直接验证实例,是指可以对定义 model 的实例,自定义代码对齐进行校验,这种使用起来相对灵活,但也不经常使用。接下通过一个简单例子进行说明一下

3.1 Model

首先定义一个 model 添加一些字段,如 Name 打上 Required、MinLength、MaxLength 这样的标记进行限制

public?class?Personal{????[Required]????public?int?ID?{?get;?set;?}????[Required]????[MinLength(2),?MaxLength(5)]????public?string?Name?{?get;?set;?}}

3.2 Validation Code

校验代码如下,先对定义的 model 进行了实例化,然后使用 Validator.TryValidateObject 方法进行校验,实际工作中需要自己进行一些封装。关键代码如下:

Personal?personal?=?new?Personal();//?personal.Name?=?"D";ValidationContext?validationContext?=?new?ValidationContext(personal);List<ValidationResult>?results?=?new?List<ValidationResult>();bool?isValid?=?Validator.TryValidateObject(personal,?validationContext,?results,?true);

3.3 验证

代码写完后,调用 API 验证一下。首先直接调用,应为代码里面没有对 Personal 实例赋值,正确的进行了 Required 标记的校验可以修改下代码 ?personal.Name = "Da",然后启动程序,调用一下 API 可以看到校验是通过的可以修改下代码 ?personal.Name = "D",然后启动程序,调用一下 API 可以看到校验是不通过的,因为长度为 1 没有满足 MinLength(2)

四、自定义 ValidationAttribute

除了可以使用 Microsoft 提供的 ValidationAttribute ,我们还可以使用自定义的 ValidationAttribute ,微软这方面提供了可扩展性。自定义的 ValidationAttribute 只需继承 ValidationAttribute,重写 IsValid 、FormatErrorMessage 即可。使用方面与 Microsoft 提供的 ValidationAttribute 使用一模一样。如下代码

public?class?CanToIntAttribute?:?ValidationAttribute{????///?<summary>????///?IsValid?为?false?时,提示得?error?信息????///?</summary>????///?<param?name="name"></param>????///?<returns></returns>????public?override?string?FormatErrorMessage(string?name)????{????????return?$"{name}?need?to?int";????}????///?<summary>????///?验证当前字段得结果????///?</summary>????///?<param?name="value"></param>????///?<returns></returns>????public?override?bool?IsValid(object?value)????{????????int?num?=?0;????????return?int.TryParse(Convert.ToString(value),?out?num);????}}

public?class?PersonalRequest{????public?int?Id?{?get;?set;?}????public?string?Name?{?get;?set;?}????[CanToInt]????public?string?Sex?{?get;?set;?}????[Required]????[MinLength(2),?MaxLength(20)]????public?string?Address?{?get;?set;?}}

五、源码

https://download.csdn.net/download/weixin_46785144/85163939

原文:https://juejin.cn/post/7095574078735515678

logo设计

创造品牌价值

¥500元起

APP开发

量身定制,源码交付

¥2000元起

商标注册

一个好品牌从商标开始

¥1480元起

公司注册

注册公司全程代办

¥0元起

    官方电话官方服务
      官方网站八戒财税知识产权八戒服务商企业需求数字市场

详解.NET Model ValidationAttribute的使用
二、ASP.NET 应用ValidationAttribute 应用在 ASP.NET MVC 中是常用得,用于对 HTPP Request 参数字段得校验,不通过得会返回 400 提示给调用方。接下通过一个简单例子进行说明一下,例子使用得是 .NET Web API 。2.1 Model首先定义一个 request model 添加一些字段,如 Name 打上 Required、MinLength...

ASP.NET的版本现在有哪几个,之间有什么区别?
在.NET Framework4 中被改进 的ValidationAttribute 类支持新的 IsValid 重载,提供关于当前验证上下文的更多信息,例如什么对象被验证了。这允许你基于 Model 的其他属性来验证当前值,例如,新的 CompareAttribute 就允许你比较 Model 的两个属性的值,在下面的例子中,ComparePassword 属性必须匹配 Password 字段来同通过验证...

如何定制Numeric属性\/字段验证消息
三、通过自定义ModelValidatorProvider替换NumericModelValidator 如果我们想改变内部类型NumericModelValidator的错误消息,可以通过将ClientDataTypeModelValidatorProvider提供的NumericModelValidator替换成另一个ModelValidator。在这里我们替换的是一个DataAnnotationsModelValidator,而它基于的ValidationAttribute是我们自定义...

如何在EF CodeFirst中使用唯一约束
方式1 自定义唯一约束 [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]public class UniqueAttribute : ValidationAttribute { public override Boolean IsValid(Object value){ \/\/校验数据库是否存在当前Key return true;} } View Code 在Model类中使用 public class E...

mvc 保存的时候 无法把断点达到action 无法将类型为System.Int32的对象...
是因为model里面注解 [StringLength(31)]这个原因造成的,因为int和dec类型的没有算长度的算法,就会出错,把StringLength这个去掉就可以了,或者只用在string类型的数据上

如何定制Numeric属性\/字段验证消息
我们使用FormatErrorMessage方法格式化后的字符串作为ModelClientValidationRule的ErrorMessage属性。1: internal class NumericAttribute : ValidationAttribute, IClientValidatable 2: { 3: public override bool IsValid(object value)4: { 5: return true;6: } 7: public IEnumerable<Mode...

如何定制Numeric属性\/字段验证消息
我们使用FormatErrorMessage方法格式化后的字符串作为ModelClientValidationRule的ErrorMessage属性。1: internal class NumericAttribute : ValidationAttribute, IClientValidatable 2: { 3: public override bool IsValid(object value)4: { 5: return true;6: } 7: public IEnumerable<Mode...

如何定制Numeric属性\/字段验证消息
我们使用FormatErrorMessage方法格式化后的字符串作为ModelClientValidationRule的ErrorMessage属性。1: internal class NumericAttribute : ValidationAttribute, IClientValidatable 2: { 3: public override bool IsValid(object value)4: { 5: return true;6: } 7: public IEnumerable<Mode...

如何在EF CodeFirst中使用唯一约束
方式1 自定义唯一约束 [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]public class UniqueAttribute : ValidationAttribute { public override Boolean IsValid(Object value){ \/\/校验数据库是否存在当前Key return true;} } View Code 在Model类中使用 public class ...

如何在EF CodeFirst中使用唯一约束
public class UniqueAttribute : ValidationAttribute { public override Boolean IsValid(Object value){ \/\/校验数据库是否存在当前Key return true;} } 在Model类中使用 public class Email { [Key]public int EmailID { get; set; } public int PersonId { get; set; } [Unique][Required][...

相似回答
大家正在搜