MVC Пользовательский массив строк проверки на стороне клиента - PullRequest
0 голосов
/ 14 февраля 2020

Существуют примеры пользовательских MVC валидаторов, которые принимают параметр массива, но только на стороне сервера - ни один из них не показывает пример реализации клиентской стороны с параметром массива.

Проблема вместо этого при выводе содержимого массива в атрибуте данных html он выводит "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[]"

Что я делаю не так?

1 Ответ

0 голосов
/ 15 февраля 2020

Вы получаете "System.String[]" строку, потому что значение ValidationParameters["propertynames"] записывается путем вызова ToString, поэтому переменная string[] возвращает "System.String[]" в этом случае. Если вам нужно вывести указанное значение c, вам нужно отформатировать его самостоятельно в атрибуте проверки. Например, измените

rule.ValidationParameters["propertynames"] = PropertyNames;

на

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

, и вы получите

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