MVC 客户端验证器 - 将布尔值作为字符串传递

MVC Client Side Validator - passes boolean as a string

我正在尝试从验证器的 'GetClientValidationRules' 方法传递布尔参数。 但是,参数以字符串的形式出现。 是否可以将参数作为实际布尔值传递?

参考代码:

服务器端:

public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
{
    var rule = new ModelClientValidationRule()
    {
        ErrorMessage = "This is an error."
        ValidationType = "test"
    }
    rule.ValidationParameters.Add("test", true);
    yield return rule;
}

客户端:

$.validator.unobtrusive.adapters.add("test", ["test"], function(options) {
    var parameter = options.params.test;

    if (parameter) { // Always true, because parameter === "True" (string value)
        ...
    }
});

我知道我可以只使用 'if (parameter === "True")' 但我想尽可能避免这样做。

如有任何帮助,我们将不胜感激。

不幸的是,所有值都作为字符串传递,因此您必须在那里解析它。

但是,您可以将其作为布尔值传递给验证方法:

$.validator.unobtrusive.adapters.add("test", ["test"], function (options) {
    var parameter = options.params.test;

    options.rules["myMethod"] = parameter.toLowerCase() === "true";
    // add other options, such as the validation message
});

$.validator.addMethod("myMethod", function (value, element, params) {
    // 'params' would be the boolean value 'true'
});

!!(parameter)Boolean(parameter) 这样的默认布尔解析方法在这里可能无法正常工作,因为它总是 returns true 如果 parameter 包含任何类型字符串,因此您需要一个返回 Boolean 的附加函数来正确解析它:

function parseBoolean(value) {
    // return value.toString().toLowerCase() === "true" also work here
    return String(value).toLowerCase() === "true";
}

然后,应修改 Will Ray 的代码以使用如下所示的函数:

$.validator.unobtrusive.adapters.add("test", ["test"], function (options) {
    var parameter = options.params.test;

    // parse as boolean value here
    options.rules["myMethod"] = parseBoolean(parameter);

    // add other options, such as the validation message
});

$.validator.addMethod("myMethod", function (value, element, params) {
    // 'params' would be the boolean value 'true'
});