ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

.NET Core - MVC 应用中 添加验证

2022-07-08 18:35:20  阅读:145  来源: 互联网

标签:Core set get DataType 验证 特性 MVC NET public


  MVC 的设计原则之一 : DRY(即“不要自我重复”)

    ASP.NET Core MVC 支持你仅指定一次功能或行为,然后使它应用到整个应用中。

    优点 : 减少所需编写的代码量,使编写的代码更少出错,更易于测试和维护。

  将验证规则添加到电影模型

    DataAnnotations 命名空间提供一组内置验证特性,可通过声明方式应用于类或属性。

    DataAnnotations 还包含DataType等格式特性,有助于格式设置但不提供任何验证。

    操作:新 Movie 类以使用内置的 RequiredStringLengthRegularExpression 和 Range 验证特性。

    例:using System;

      using System.ComponentModel.DataAnnotations;
      using System.ComponentModel.DataAnnotations.Schema;

      namespace MvcMovie.Models
      {
        public class Movie
        {
          public int Id { get; set; }

          [StringLength(60, MinimumLength = 3)]
          [Required]
          public string? Title { get; set; }

          [Display(Name = "Release Date")]
          [DataType(DataType.Date)]
          public DateTime ReleaseDate { get; set; }

          [Range(1, 100)]
          [DataType(DataType.Currency)]
          [Column(TypeName = "decimal(18, 2)")]
          public decimal Price { get; set; }

          [RegularExpression(@"^[A-Z]+[a-zA-Z\s]*$")]
          [Required]
          [StringLength(30)]
          public string? Genre { get; set; }

          [RegularExpression(@"^[A-Z]+[a-zA-Z0-9""'\s-]*$")]
          [StringLength(5)]
          [Required]
          public string? Rating { get; set; }
        }
      }

    验证特性指定要对应用这些特性的模型属性强制执行的行为:

      Required和MinimumLength 特性:表示属性必须有值;但用户可输入空格来满足此验证。

      RegulaExpression 特性 : 用于限制可输入的字符。上述代码中,

        “Genre”:只能使用字母、第一个字母必须大写。允许使用空格,但不允许使用数字和特殊字符。

      RegularExpression "Rating"(分级):

        要求第一个字母为大写字母

        允许在后续空格中使用特殊字符和数字。“PG-13”对“分级”有效,但对于“分类”无效。

      Range 特性 :将值限制在指定范围内。

      StringLength特性 :使你能够设置字符串属性的最大长度,以及可选的最小长度。

      从本质上来说,需要值类型(如decimal、int、float、DateTime),但不需要[Required]特性。

    让 ASP.NET Core 强制自动执行验证规则有助于提升你的应用的可靠性。 同时它能确保你无法忘记验证某些内容,并防止你无意中将错误数据导入数据库。

  验证错误UI    

    运行应用并导航到电影控制器。

    选择“新建”链接以添加新电影。 使用无效值填写表单。 当 jQuery 客户端验证检测到错误时,会显示一条错误消息。

  验证工作原理

    两种Create方法:

      例:①.   // GET: Movies/Create

          public IActionResult Create()
          {
            return View();
          }

          该Create(HTTP GET)操作方法显示初始的“创建”表单。

        ②.   // POST: Movies/Create
          // To protect from overposting attacks, enable the specific properties you want to bind to.
          // For more details, see http://go.microsoft.com/fwlink/?LinkId=317598.
          [HttpPost]
          [ValidateAntiForgeryToken]
          public async Task<IActionResult> Create([Bind("Id,Title,ReleaseDate,Genre,Price,Rating")] Movie movie)
          {
            if (ModelState.IsValid)
            {
              _context.Add(movie);
              await _context.SaveChangesAsync();
              return RedirectToAction(nameof(Index));
            }
            return View(movie);
          }

          该Create(HTTPPost)处理表单发布.

          调用ModelState.IsValid以检查电影是否有验证错误。

          调用此方法将评估已应用于对象的任何验证特性。如果对象有验证错误,则Create方法会重新显示此表单。 如果没有错误,此方法则将新电影保存在数据库中。

  使用DateType特性

    打开 Movie.cs 文件并检查 Movie 类。

    除了一组内置的验证特性,System.ComponentModel.DataAnnotations 命名空间还提供格式特性。

    我们已经在发布日期和价格字段中应用了 DataType 枚举值。

    以下代码显示具有适当 DataType 特性的 ReleaseDate 和 Price 属性:

      [Display(Name = "Release Date")]

      [DataType(DataType.Date)]
      public DateTime ReleaseDate { get; set; }

      [Range(1, 100)]
      [DataType(DataType.Currency)]
      [Column(TypeName = "decimal(18, 2)")]
      public decimal Price { get; set; }

    DataType 属性仅提供相关提示来帮助视图引擎设置数据格式。可以使用 RegularExpression 特性验证数据的格式。 

    DataType 属性用于指定比数据库内部类型更具体的数据类型,它们不是验证属性。

    DataType.Date 不指定显示日期的格式。

    DisplayFormat 特性用于显式指定日期格式:

      例:[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]

        public DateTime ReleaseDate { get; set; }

        ApplyFormatInEditMode 设置指定在文本框中显示值以进行编辑时也应用格式。

      可以单独使用 DisplayFormat 特性,但通常建议使用 DataType 特性。

      DataType 特性传达数据的语义而不是传达如何在屏幕上呈现数据,并提供 DisplayFormat 不具备的以下优势:

        可启用 HTML5 功能(例如显示日历控件、区域设置适用的货币符号、电子邮件链接等)

        默认情况下,浏览器将根据区域设置采用正确的格式呈现数据。

        DataType 特性使 MVC 能够选择正确的字段模板来呈现数据(如果 DisplayFormat 由自身使用,则使用的是字符串模板)。

    以下代码显示组合在一行上的特性:      

      using System;
      using System.ComponentModel.DataAnnotations;
      using System.ComponentModel.DataAnnotations.Schema;

      namespace MvcMovie.Models
      {
        public class Movie
        {
          public int Id { get; set; }

          [StringLength(60, MinimumLength = 3)]
          public string Title { get; set; }

          [Display(Name = "Release Date"), DataType(DataType.Date)]
          public DateTime ReleaseDate { get; set; }

          [RegularExpression(@"^[A-Z]+[a-zA-Z\s]*$"), Required, StringLength(30)]
          public string Genre { get; set; }

          [Range(1, 100), DataType(DataType.Currency)]
          [Column(TypeName = "decimal(18, 2)")]
          public decimal Price { get; set; }

          [RegularExpression(@"^[A-Z]+[a-zA-Z0-9""'\s-]*$"), StringLength(5)]
          public string Rating { get; set; }
        }
      }

    进行测试,点击 之后 “Movie” 一直报错 : “SqlNullValueException: Data is Null. This method or property cannot be called on Null values.”

    经过检查,发现是之前加的Rating字段,新增校验后不能为空,但是数据库中该字段之前未赋值,为空导致该问题

         注销校验特性,为该字段赋值后,加上该注释后不再出现该问题。

标签:Core,set,get,DataType,验证,特性,MVC,NET,public
来源: https://www.cnblogs.com/AlbertNicole/p/16459335.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有