javascript验证用户名不能为空_理解ASP.NET Core中的模型验证

0f96edae8ca88f15e7c455f921a8044a.png

当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列表。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值