ASP.NET Coreでのカスタム検証機能の実装(CustomValidation Attribute)

4622 ワード

これは実際の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