谈谈ASP.NET Core 中的模型验证(自定义验证和远程验证)

在上篇文章中,我对ASP.NET CORE中的模型绑定进行介绍,现在就说明如何对模型进行验证

首先,ASP.NET CORE自带默认的模型绑定,还是看这个例子,
ModelState.IsValid方法会对该模型中每个对象进行验证(是否为空,是格式是否正确),无效的对象则将在客户端提示错误信息,该错误信息由ModelState.AddModelError(string.Empty, error.Description生成

 public async Task<IActionResult> AddUser(UserCreateViewModel userCreateViewModel)
        {
            //模型验证,将会对userCreateViewModel中每个对象进行验证,确定每个对象都是有效的
            if (!ModelState.IsValid)
            {
                return View(userCreateViewModel);
            }
            ......
foreach (IdentityError error in result.Errors)
            {
                ModelState.AddModelError(string.Empty, error.Description);
            }
            return View(userCreateViewModel);

我们也可以自定义一个模型验证,这样写的好处是可以实现代码的复用,可以不需要再到Action里对model进行验证,例如添加一个类,该类必须继承于IModelValidator这个接口以及Attribute这个父类

public class ValidUrlAttribute : Attribute, IModelValidator
{
    public string ErrorMessage { get; set; }

    public IEnumerable<ModelValidationResult> Validate(
        ModelValidationContext context)
    {
        var url = context.Model as string;
        if (url != null && Uri.IsWellFormedUriString(url, UriKind.Absolute))
        {
            return Enumerable.Empty<ModelValidationResult>();
        }

        return new List<ModelValidationResult>
        {
            new ModelValidationResult(string.Empty, ErrorMessage)
        };
    }
}

然后再model里,我们只需要这样引用,在实体对象上[ValidUrl(ErrorMessage = “这个URL不正确”)],就对自动调用该ValidUrlAttribute下面的模型验证方法Validate()

[Display(Name = "封面地址")]
[Required(ErrorMessage = "{0}是必填项"), MaxLength(200, ErrorMessage = "{0}的长度不可超过{1}")]
//[DataType(DataType.Url)]
[ValidUrl(ErrorMessage = "这个URL不正确")]
public string CoverUrl { get; set; }

还有一致方法,远程验证

所谓远程验证就是调用后端action里的方法实现在客户端的模型验证(在post之前验证)

具体使用方法如下
首先,我们在持有该模型的控制器定义一个方法CheckRoleExist()这里绑定了前端HTTP中的RoleName字段,实现拒绝添加同名角色的post请求

[AcceptVerbs("Get", "Post")]
public async Task<IActionResult> CheckRoleExist([Bind("RoleName")]string roleName)
{
    var role = await _roleManager.FindByNameAsync(roleName);

    if (role != null) return Json("角色已经存在了");

    return Json(true);
}

如同上面一样,在模型中添加验证 [Remote(nameof(RoleController.CheckRoleExist), “Role”, ErrorMessage = “角色已存在”)],Remote()中第一个参数写方法名,第二个写控制器名称

public class RoleAddViewModel
{
    [Required]
    [Display(Name = "角色名称")]
    [Remote(nameof(RoleController.CheckRoleExist), "Role", ErrorMessage = "角色已存在")]
    public string RoleName { get; set; }
}

远程验证有利于减少服务器的压力,还是值得推荐的,当然使用js进行验证也是同样的道理。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值