多字段的MVC表单验证

Sco*_*ott 20 c# forms validation asp.net-mvc asp.net-mvc-3

为了验证的目的,我如何将MVC 3表单上的多个文本框视为一个文本框?

这是一个简单的电话号码字段,其中一个区域代码文本框,一个用于前缀,一个用于最后四个数字.

实际上有两个验证要求:

1)他们都是必需的.2)它们都必须包含整数.

现在,对于单个字段执行此操作很简单,但是如何使用MVC创建ASP.NET CustomValidator的等效项,以便我可以将所有三个字段作为一个整体进行验证?

Sco*_*ott 21

我实际上最终实现了一个自定义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"
            };
        }
    }
Run Code Online (Sandbox Code Playgroud)


Tho*_*mas 18

您可以通过放置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.");
      }

}
Run Code Online (Sandbox Code Playgroud)