.NET Core - MVC 应用中 添加验证
MVC 的设计原则之一 : DRY(即“不要自我重复”)
ASP.NET Core MVC 支持你仅指定一次功能或行为,然后使它应用到整个应用中。
优点 : 减少所需编写的代码量,使编写的代码更少出错,更易于测试和维护。
将验证规则添加到电影模型
DataAnnotations 命名空间提供一组内置验证特性,可通过声明方式应用于类或属性。
DataAnnotations 还包含DataType等格式特性,有助于格式设置但不提供任何验证。
操作:新 Movie
类以使用内置的 Required
、StringLength
、RegularExpression
和 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字段,新增校验后不能为空,但是数据库中该字段之前未赋值,为空导致该问题
注销校验特性,为该字段赋值后,加上该注释后不再出现该问题。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)