在ASP.NET Core中實現自定義驗證特性(Custom Validation Attribute)


這是我們在實際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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM