ASP.NET Coreでのカスタム検証機能の実装(CustomValidation Attribute)
4622 ワード
これは実際のASPです.NET Coreプロジェクトで使用したもので、ユーザー名にスペースが含まれているかどうかを確認します.
最初はそうだった(ValidationAttributeを継承し、IsValidメソッドを書き換える):
しかし,これはサービス側検証にのみ有効であり,フロントエンド検証には無効であることが分かった.資料を調べてみると、IClientModelValidatorインタフェースを実装する必要があることがわかりました(nugetパッケージ--Microsoft.AspNetCore.Mvc.Abstractionsをインストールする必要があります):
それでも十分ではありません.実際に動作するフロントエンド検証jsコードを追加する必要があります.
この3ステップを経ると,前後端の二重検証が正常に行われる.
【参考資料】
Validation using IClientModelValidator
ASP.Net Core MVC - Client-side validation for custom attribute
最初はそうだった(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