文章出處
文章列表
這是我們在實際ASP.NET Core項目中用到的,驗證用戶名中是否包含空格。
開始是這么實現的(繼承ValidationAttribute,重寫IsValid方法):
public class NoSpaceAttribute : ValidationAttribute { private static readonly Regex _noSpaceRegex = new Regex(@"^[^\s]+$", RegexOptions.Compiled); public override bool IsValid(object value) { string stringValue = Convert.ToString(value, CultureInfo.CurrentCulture); if (string.IsNullOrEmpty(stringValue)) { return true; } return _noSpaceRegex.IsMatch(stringValue); } }
但發現這樣只對服務端驗證有效,對前端驗證無效。查資料后知道原來還需要實現 IClientModelValidator 接口(需要安裝nuget包——Microsoft.AspNetCore.Mvc.Abstractions):
public class NoSpaceAttribute : ValidationAttribute, IClientModelValidator { //... public void AddValidation(ClientModelValidationContext context) { MergeAttribute(context.Attributes, "data-val", "true"); var errorMessage = FormatErrorMessage(context.ModelMetadata.GetDisplayName()); MergeAttribute(context.Attributes, "data-val-nospace", errorMessage); } private bool MergeAttribute( IDictionary<string, string> attributes, string key, string value) { if (attributes.ContainsKey(key)) { return false; } attributes.Add(key, value); return true; } }
這樣依然不夠,還需要添加真正干活的前端驗證js代碼:
$(function ($) { $.validator.addMethod("nospace", function (value, element, parameters) { return /^[^\s]+$/g.test(value); }); $.validator.unobtrusive.adapters.addBool("nospace"); }(jQuery));
經過這3步,就可以正常進行前后端雙重驗證。
【參考資料】
Validation using IClientModelValidator
ASP.Net Core MVC - Client-side validation for custom attribute
文章列表
全站熱搜