Подтвердить что ты не робот

Проверка MVC-формы на нескольких полях

Как я могу использовать несколько текстовых полей в форме MVC 3, которые рассматриваются как одна для целей проверки?

Это простое поле номера телефона с одним текстовым полем для кода области, один для префикса и один для последних четырех цифр.

Существуют два требования проверки:

1) Все они нужны. 2) Они должны содержать целые числа.

Теперь это просто, когда вы делаете это для отдельных полей, но как я могу создать эквивалент ASP.NET CustomValidator с MVC, чтобы я мог проверить все три поля в целом?

4b9b3361

Ответ 1

Фактически я решил реализовать пользовательский ValidationAttribute, чтобы решить эту проблему, используя тот же тип логики, представленный в CompareAttribute, который позволяет использовать отражение для оценки значений других свойств. Это позволило мне реализовать это на уровне свойств вместо уровня модели, а также позволяет проверять на стороне клиента через ненавязчивый javascript:

public class MultiFieldRequiredAttribute : ValidationAttribute, IClientValidatable
    {
        private readonly string[] _fields;

        public MultiFieldRequiredAttribute(string[] fields)
        {
            _fields = fields;
        }

        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            foreach (string field in _fields)
            {
                PropertyInfo property = validationContext.ObjectType.GetProperty(field);
                if (property == null)
                    return new ValidationResult(string.Format("Property '{0}' is undefined.", field));

                var fieldValue = property.GetValue(validationContext.ObjectInstance, null);

                if (fieldValue == null || String.IsNullOrEmpty(fieldValue.ToString()))
                    return new ValidationResult(this.FormatErrorMessage(validationContext.DisplayName));
            }

            return null;
        }

        public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
        {
            yield return new ModelClientValidationRule
            {
                ErrorMessage = this.ErrorMessage,
                ValidationType = "multifield"
            };
        }
    }

Ответ 2

Вы можете справиться с этим, поместив IValidatableObject в класс модели и внедряя метод Validate.

Он может выглядеть примерно так:

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
      if (String.IsNullOrEmpty(_PhonePart1) || String.IsNullOrEmpty(_PhonePart2)
            || String.IsNullOrEmpty(_PhonePart3))
      {
           yield return new ValidationResult("You must enter all " + 
                  "three parts of the number.");
      }

}

Ответ 3

Скотт. Использует ли пользовательское связующее устройство в своей области? Если это так, вы можете реализовать IModelBinder, чтобы объединить результаты из трех текстовых полей в поле с одним номером телефона, которое может быть украшено атрибутами проверки. Вот вопрос stackoverflow, который имеет пример того, как это сделать: Проверка данных и пользовательский ModelBinder