在上篇文章中,我对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进行验证也是同样的道理。