You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET自定义验证属性无法在客户端生效的原因咨询

自定义验证属性客户端不生效的原因及解决方法

你的自定义UniqueSkuAttribute仅实现了服务端验证逻辑,未配置客户端验证所需的元数据和JavaScript规则,这是导致客户端不生效的核心原因。默认的Required、RegularExpression等属性已经内置了客户端验证支持,而自定义属性需要手动完成以下配置:

1. 修改自定义验证属性,实现客户端验证接口

让UniqueSkuAttribute实现IClientModelValidator接口,添加客户端验证所需的元数据(生成页面元素的data-val-*属性):

using Microsoft.AspNetCore.Mvc.ModelBinding.Validation;

public class UniqueSkuAttribute : ValidationAttribute, IClientModelValidator
{
    // 修正服务端验证逻辑:IsValid返回true表示验证通过,因此SKU不存在时才返回true
    public override bool IsValid(object? value)
    {
        if (value == null)
        {
            return false; 
        }

        // IsValueExist返回true表示SKU已存在,取反后表示验证通过
        return !IsValueExist(value.ToString());
    }

    public void AddValidation(ClientModelValidationContext context)
    {
        // 启用客户端验证
        MergeAttribute(context.Attributes, "data-val", "true");
        // 设置验证失败提示信息
        MergeAttribute(context.Attributes, "data-val-uniquesku", ErrorMessage ?? "该SKU已存在");
    }

    // 辅助方法:避免重复添加属性
    private bool MergeAttribute(IDictionary<string, string> attributes, string key, string value)
    {
        if (attributes.ContainsKey(key)) return false;
        attributes.Add(key, value);
        return true;
    }

    // 你的SKU存在检查方法
    private bool IsValueExist(string sku)
    {
        // 原有的检查逻辑
    }
}

2. 添加后端验证接口

客户端需要调用后端接口异步检查SKU唯一性,新增一个API接口:

[HttpPost]
public IActionResult CheckSkuUnique(string sku)
{
    // 返回true表示SKU唯一(验证通过),false表示已存在
    bool isUnique = !IsValueExist(sku);
    return Json(isUnique);
}

3. 编写客户端JavaScript验证逻辑

在视图中(或单独的JS文件,需在_ValidationScriptsPartial.cshtml之后加载)添加jQuery Validate自定义验证规则:

// 注册自定义验证方法
$.validator.addMethod("uniquesku", function (value, element) {
    // 空值交由Required验证处理,这里返回true跳过当前验证
    if (!value) return true;

    let isUnique = false;
    // 同步请求后端接口检查唯一性
    $.ajax({
        url: '/YourController/CheckSkuUnique', // 替换为你的控制器和接口路径
        type: 'POST',
        async: false,
        data: { sku: value },
        success: function (res) {
            isUnique = res;
        },
        error: function () {
            isUnique = false;
        }
    });
    return isUnique;
});

// 关联验证方法与HTML的data属性
$.validator.unobtrusive.adapters.add("uniquesku", [], function (options) {
    options.rules["uniquesku"] = true;
    options.messages["uniquesku"] = options.message;
});

4. 验证视图生成的属性

确保视图中的input元素已生成data-val-uniquesku属性,示例生成的HTML应类似:

<input asp-for="SKU" maxlength="13" class="form-control" placeholder="SKU" 
       data-val="true" 
       data-val-required="Value is needed" 
       data-val-uniquesku="Value already exist" 
       data-val-regex="Value in template of: 01234567890xx" 
       data-val-regex-pattern="^\d{11}[a-zA-Z]{2}$">

完成以上步骤后,客户端就能触发SKU唯一性的实时验证了。

内容的提问来源于stack exchange,提问作者Yaron Binder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 21:20:36