【问题标题】:MVC Custom Validation String Array Client SideMVC 自定义验证字符串数组客户端
【发布时间】:2020-05-30 09:48:14
【问题描述】:

有一些使用数组参数的自定义 MVC 验证器的示例,但仅限于服务器端 - 它们都没有显示使用数组参数实现客户端的示例。

问题是不是在html data-属性中输出数组的内容,而是输出“System.String[]”:

data-val-total-propertynames="System.String[]"

这是我的属性类:

public class TotalAttribute : ValidationAttribute, IClientValidatable
    {
        private String[] PropertyNames { get; set; }              

        public TotalAttribute(String[] propertyNames)
        {
            PropertyNames = propertyNames;                      
        }

        protected override ValidationResult IsValid(object value, ValidationContext context)
        {
            float total = 0;

            foreach (var propertyName in PropertyNames)            
                total += (float)context.ObjectInstance.GetType().GetProperty(propertyName).GetValue(context.ObjectInstance, null);

            if (total != (float)value)
                return new ValidationResult(FormatErrorMessage(context.DisplayName), new[] { context.MemberName });            

            return ValidationResult.Success;
        }

        public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
        {
            var rule = new ModelClientValidationRule
            {
                ErrorMessage = ErrorMessageString,
                ValidationType = "total",
            };
            rule.ValidationParameters["propertynames"] = PropertyNames;

            yield return rule;
        }
    }

这里是在模型中实现的:

[Total(new string[] { "SomeOtherField1", "SomeOtherField2" }, ErrorMessage = "'Line12Balance' must equal total of 'SomeOtherField1' and 'SomeOtherField2'")]
public decimal? Line12Balance { get; set; }

这里是html data-val 属性输出:

data-val-total-propertynames="System.String[]"

我做错了什么?

【问题讨论】:

    标签: arrays asp.net-mvc customvalidator


    【解决方案1】:

    你得到"System.String[]"字符串,因为ValidationParameters["propertynames"]的值是通过调用ToString写入的,所以string[]变量在这种情况下返回"System.String[]"。如果您需要输出特定值,则需要在您的验证属性中自行格式化。例如,改变

    rule.ValidationParameters["propertynames"] = PropertyNames;
    

    rule.ValidationParameters["propertynames"] =  string.Join(",", PropertyNames);
    

    你会得到

    data-val-total-propertynames="SomeOtherField1,SomeOtherField2"
    

    【讨论】:

    • 太棒了,谢谢。现在我必须在客户端处理程序中将逗号分隔的字符串转换为数组?
    • var value = "SomeOtherField1,SomeOtherField2"; var arr = value.split(",");
    • 就是这样。谢谢。也许我的帖子可以作为一个例子来帮助别人。
    【解决方案2】:

    正如 Alexander 在他的回答中提到的,您遇到的问题是 string[] 没有自己的 ToString() 实现,并使用基本的 object.ToString() 实现,它只显示对象的类型而不是数组的内容。

    所以你必须以某种方式序列化你的字符串数组,以便它可以存储在一个字符串中,然后在你的客户端 JavaScript 中解析。

    如果您已经在您的解决方案中使用 JSON.Net(很多),您也可以通过 JSON 序列化服务器端的数组,然后解析 JSON 客户端来做到这一点。

    即服务器端:

    rule.ValidationParameters["propertynames"] =  JsonConvert.SerializeObject(PropertyNames);
    

    客户端:(

    $.validator.addMethod('rule', function(value, element, params) {
        var propertynames = JSON.parse(params.propertynames);
        // do your validation
    });
    

    这使您不必在参数中转义逗号/分隔符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-16
      • 1970-01-01
      • 2014-03-19
      相关资源
      最近更新 更多