1. 程式人生 > 實用技巧 >asp.net core2 mvc 基礎教程--Model 驗證 Again

asp.net core2 mvc 基礎教程--Model 驗證 Again

自定義驗證 Attribute

  • Attribute,IModelValidator

示例:ValidUrlAttribute

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) }; } }

使用時標註在 ViewModel 等實體類的屬性上即可:

[Display(Name = "封面地址")]

[Required(ErrorMessage = "{0}是必填項"), MaxLength(200, ErrorMessage = "{0}的長度不可超過{1}")]

//[DataType(DataType.Url)]

[ValidUrl(ErrorMessage = "這個URL不正確")]

public string CoverUrl { get; set; }

遠端驗證

  • [Remote]
  • 客戶端呼叫 Action 方法進行驗證(前臺呼叫後臺驗證)

Action 中的方法:

[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);
}

標註屬性:

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

}

注:暫時沒找到更優雅的方法獲取到 "Role"。