当MVC执行模型绑定后,为了验证绑定为参数提供的值是否符合预期,还需要进行模型验证。

一、理解模型验证

模型验证是指模型绑定后对Action参数进行验证的过程。它会根据事先定义的规则对参数的值进行验证,验证的结果可以通过ControllerBase类的ModelState属性获取,它的IsValid属性用来说明是否通过验证。

public IActionResult Create(Model model){    if (!ModelState.IsValid)    {        return View();    }    // 通过验证,继续执行后续逻辑}

二、数据注解与验证

设置验证规则最常见的方式是使用数据注解。数据注解包括一系列特性,这些特性均位于System.ComponentModel.DataAnnotations命名空间下。

public class User{    [Required]    public int Id { get; set; }    [Required, MinLength(2)]    public string FirstName { get; set; }    [Url]    public string Website { get; set; }    [DataType(DataType.Password)]    public string Password { get; set; }}

上例中用到了一些数据注解特性,如[Required]、[MinLength]、[Url]、[DataType]等,其中[Required]特性要求相应的属性值不能为空,必须提供;[MinLength]则可以指定属性值的最小长度;[Url]特性指明该属性的值必须是一个URL;[DataType]特性用于指明该属性的数据类型。

广告

Docker经典实例

作者:[美]戈阿冈(Sébastien,Goasguen)

京东

除了上面用到的特性外,数据注解还包含很多其他特性,在对用户提交的数据进行验证时,这些特性都非常有用。如果想要查看所有数据注解特性,可查看这里:https://docs.microsoft.com/dotnet/api/system.componentmodel.dataannotations。

在使用数据注解特性时,我们可以为它们指定ErrorMessage属性,用于指明当该属性值验证失败时要显示的错误信息。

[Required(ErrorMessage = "用户名不能为空")][MinLength(2, ErrorMessage = "姓名不能少于2个字符")]

当为模型定义了数据注解特性后,为了在Action中验证参数是否符合规则,应首先检查ModelState.IsValid属性。

在视图中,为了显示错误消息,可以添加

或元素,并结合asp-validation-summary以及asp-validation-for标签来分别显示所有错误消息汇总以及针对某个属性的错误消息。

    

    

三、自定义验证规则

如果系统提供的验证特性满足不了我们的验证需求,ASP.NET Core允许通过两种方式来创建自定义验证规则,一种是创建继承自ValidationAttribute类的派生类,另一种是使用IValidatableObject接口。

举例来说,如果我们希望Model中某个属性的值必须以固定的字符串开始,则可以定义如下验证特性:

  • 上例中,StartWithAttribute类继承自ValidationAttribute,并且重写了基类的ValidationResult方法,通过返回ValidationResult对象来说明验证是否成功。

提示:ValidationResult方法的ValidationContext参数表示验证上下文,通过它的ObjectInstance属性能够获取当前用于验证的模型(或实体对象)。

接下来,只要像使用系统验证特性一样使用它就可以:

[StartWith(StartValue = "Abc")]

另一种方式使用IValidatableObject接口,要使用这种方式,模型类需要实现这个接口。这个接口包含一个成员:

IEnumerableValidate(ValidationContext validationContext);

具体例子如下:

public class MovieIValidatable : IValidatableObject{    private const int _classicYear = 1960;    public int Id { get; set; }    [Required]    [StringLength(100)]    public string Title { get; set; }    [Required]    public DateTime ReleaseDate { get; set; }    [Required]    [StringLength(1000)]    public string Description { get; set; }    [Range(0, 999.99)]    public decimal Price { get; set; }    [Required]    public Genre Genre { get; set; }    public bool Preorder { get; set; }    public IEnumerable Validate(ValidationContext validationContext)    {        if (Genre == Genre.Classic && ReleaseDate.Year > _classicYear)        {            yield return new ValidationResult(                $"Classic movies must have a release year earlier than {_classicYear}.",                new[] { "ReleaseDate" });        }    }}

在Validate方法中,我们可以对所有需要自定义验证的属性进行判断、验证,并最终返回一个ValidationResult列表。

比较这两种方法,前一种主要针对一个属性进行验证,而后一种则可以对多个属性集中验证;前一种方法不需要修改模型类的源码(仅需要为属性添加特性),后一种方法则需要修改模型类的源码。具体要使用哪种方法,可根据实际情况而定。

asp绑定gridview属性_理解ASP.NET Core中的模型验证相关推荐

  1. asp绑定gridview属性_如何在ASP.NET Core中自定义Azure Storage File Provider

    主题:如何在ASP.NET Core中自定义Azure Storage File Provider 作者: Lamond Lu 地址:  https://www.cnblogs.com/lwqlun/ ...

  2. 七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC

    七天学会ASP.NET MVC (一)--深入理解ASP.NET MVC 系列文章 七天学会ASP.NET MVC (一)--深入理解ASP.NET MVC 七天学会ASP.NET MVC (二)-- ...

  3. ASP.NET Core MVC 中的模型验证

    数据模型的验证被视为是数据合法性的第一步,要求满足类型.长度.校验等规则,有了MVC的模型校验能够省却很多前后端代码,为代码的简洁性也做出了不少贡献. 原文地址:https://docs.micros ...

  4. 在asp.net core中使用的验证框架FluentValidation

    FluentValidation在asp.net core中怎么使用? 先安装包. Install-Package FluentValidation.AspNetCore 和上一篇的实体类和验证类一样 ...

  5. core控制器属性注入的用处_理解 ASP.NET Core 依赖注入

    DI在.NET Core里面被提到了一个非常重要的位置,介绍一下.NET  Core的DI实现以及对实例生命周期的管理,在控制台以及Mvc下如何使用DI,以及如何把默认的Service Contain ...

  6. asp easp 开源框架_国内ASP开源建站系统一览

    开源建站程序让编程高手和只懂打字上网的人都可以快速建立一个功能强大.界面漂亮的网站.不管你是想建一个博客.论坛.CMS.电子商务网站,或是Wiki.相册管理.RSS聚合和类Digg网站.你都可以通过这 ...

  7. ASP.NET Core 添加统一模型验证处理机制

    一.前言 模型验证自ASP.NET MVC便有提供,我们可以在Model(DTO)的属性上加上数据注解(Data Annotations)特性,在进入Action之前便会根据数据注解,来验证输入的数据 ...

  8. python类的属性和对象属性_在python的类中动态添加属性与生成对象

    本文将通过一下几个方面来一一进行解决 1.程序的主要功能 2.实现过程 3.类的定义 4.用生成器generator动态更新每个对象并返回对象 5.使用strip 去除不必要的字符 6.rematch ...

  9. 访问 asp网页 白屏_(02)ASP如何设定主目录和默认文档

    本节主要介绍更改ASP文件存储主目录,即在服务器计算机上的物理路径和设定默认访问文档两个问题.这两个问题一解决,我们就可以进行程序设计的动态网页互动环节了. 一. 更改主目录 1. 以Windows ...

最新文章

  1. Print all attributes and values in a Javascript Object
  2. ORA-01502: 索引'P_ABCD.PK_WEB_BASE'或这类索引的分区处于不可用状态
  3. mysql bitmap index_[MySQL] mysql中bitmap的简单运用
  4. html和c的区别,tn-s系统与TN-C的区别是什么
  5. date命令使用文档.txt
  6. Css选择器权重排序详解+权重计算
  7. 刷脸支付将替代传统的聚合收款二维码
  8. 实验一 作业管理系统的总结与期望
  9. 仪表研发工程师所需要了解的蓝牙和WiFi知识
  10. 递归,根据部门id获取部门树下的某个部门名称
  11. How to make a ipcamera
  12. 汽车CAN总线分析仪
  13. 多种方式解决Java控制台报错 java.util.LinkedHashMap cannot be cast to.....
  14. xutils3.0使用
  15. HeadFrist设计模式学习之做一个万能遥控器(命令模式)
  16. Oracle 预借差旅费,关于申请出差费用实报的请示-柳州工人医院.DOC
  17. 港科百创 | 极目生物宣布引进FDA批准干眼治疗器械大中华区、韩国及东盟十国独家权益...
  18. 蒸气压缩式空调制冷原理图解
  19. 「网工必备」五款工作学习必备软件免费下载
  20. 数电实验九 译码显示电路(3)多数表决器的实现

热门文章

  1. 生产制造类企业从企业邮箱切换到自建系统的方案
  2. 单载波调制和OFDM调制比较
  3. centos7下kafka2.12-2.1.0的安装及使用
  4. c++实现websocket服务端与JavaScript通讯
  5. Linux中profile、bashrc、bash_profile之间的区别和联系
  6. VC++中进程间相互通信的十一种方法
  7. pycharm ssh mysql_PyCharm使用之配置SSH Interpreter的方法步骤
  8. 树莓派python实例_使用Python实现树莓派WiFi断线自动重连实例(附代码)
  9. linux学习之ARM的三大工具链
  10. 微信小程序日期选择器