文章出處

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


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()