ASP.NET中的自定义客户端验证

kx1ctssn  于 2023-08-08  发布在  .NET
关注(0)|答案(2)|浏览(169)

我创建了一个简单的自定义验证。它在服务器端工作正常(使用ModelState.IsValid),但我想让它在客户端运行。
常规验证器,如RequiredRegularExpression在客户端工作得很好。
我的自定义属性:

public class UniqueSkuAttribute : ValidationAttribute
{
    public override bool IsValid(object? value)
    {
        if (value == null)
        {
            return false; 
        }

        // IsValueExist() is my own method
        return IsValueExist(value.ToString());
    }
}

字符串
我的财产:

[Required(ErrorMessage = "Value is needed")]
[UniqueSku(ErrorMessage = "Value already exist")]
[RegularExpression("^\\d{11}[a-zA-Z]{2}$", ErrorMessage = "Value in template of: 01234567890xx")]
public string SKU { get; set; }


使用该属性视图:

<div class="form-floating mb-3 mt-3">
    <input asp-for="SKU" maxlength="13" class="form-control" placeholder="SKU">
    <label asp-for="SKU">Project SKU</label>
    <span asp-validation-for="SKU" class="text-danger"></span>
</div>


此外,我当然还添加了_ValidationScriptsPartial.cshtml文件作为每个视图页面的一部分。
有一个原因,为什么自定义验证器是不工作的客户端?

h22fl7wq

h22fl7wq1#

IsValueExist的逻辑需要在客户端复制,并添加到不显眼的验证库中,以使其工作,如下所示:
C#语言

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
public class UniqueSkuAttribute : ValidationAttribute, IClientModelValidator
{
    public void AddValidation(ClientModelValidationContext context)
    {
        MergeAttribute(context.Attributes, "data-val", "true");
        var errorMsg = FormatErrorMessage(context.ModelMetadata.GetDisplayName());
        MergeAttribute(context.Attributes, "data-val-uniquesku", errorMsg);
    }
    public override bool IsValid(object? value)
    {
        if (value == null)
        {
            return false;
        }

        // IsValueExist() is my own method
        return IsValueExist(value.ToString());
    }

    private bool MergeAttribute(
                IDictionary<string, string> attributes,
                string key,
                string value)
    {
        if (attributes.ContainsKey(key))
        {
            return false;
        }
        attributes.Add(key, value);
        return true;
    }
}

字符串
JS

$.validator.addMethod("uniquesku",
    function (value, element, parameters) {
        // Here goes your IsValueExist logic that returns bool
    });

$.validator.unobtrusive.adapters.add("uniquesku", [], function (options) {
    options.rules.uniquesku = {};
    options.messages["uniquesku"] = options.message;
});

s8vozzvw

s8vozzvw2#

基本上,你需要在你的客户端实现这一点。
例如,假设你有一个像下面这样的模型:

public class TestClass
{
    [Required]
    public string Name { get; set; }

    [Required]
    [EmailAddress] // You can even pass your own regex's here
    public string Email { get; set; }
}

字符串
您可以在客户端模板中引用它,如下所示:

<input class="form-control" asp-for="Input.Name">
      <label asp-for="Input.Name"></label>
      <span class="text-danger field-validation-valid" asp-validation-for="Input.Name"></span>
<input class="form-control" asp-for="Input.Email">
      <label asp-for="Input.Email"></label>
      <span class="text-danger field-validation-valid" asp-validation-for="Input.Email"></span>


在模板中查找属性asp-validation-for属性,该属性在客户端执行魔术,将模型类中的验证配对到模板中。
作为参考,请参阅链接here

相关问题