MVC Form Validation en varios campos

¿Cómo voy a tener múltiples cuadros de texto en un formulario MVC 3 tratado como uno solo para fines de validación?

Es un campo de número de teléfono simple con un cuadro de texto para el código de área, uno para el prefijo y otro para los últimos cuatro dígitos.

En realidad, hay dos requisitos de validación:

1) Todos son obligatorios 2) Todos deben contener enteros.

Ahora bien, esto es simple cuando lo hago para campos individuales, pero ¿cómo puedo crear el equivalente de un VisualValidator personalizado de ASP.NET con MVC para que pueda validar los tres campos como un todo?

De hecho terminé implementando un ValidationAttribute personalizado para resolver esto, usando el mismo tipo de lógica presentado en CompareAttribute que le permite usar el reflection para evaluar los valores de otras propiedades. Esto me permitió implementar esto en el nivel de propiedad en lugar del nivel de modelo y también permite la validación del lado del cliente a través de JavaScript no intrusivo:

 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 GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { yield return new ModelClientValidationRule { ErrorMessage = this.ErrorMessage, ValidationType = "multifield" }; } } 

Puede manejar esto poniendo IValidatableObject en la clase de modelo e implementando el método Validate .

Podría verse algo como esto:

 public IEnumerable 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."); } } 

Scott, ¿está usando un encuadernador de modelo personalizado dentro de su scope? De ser así, puede implementar un IModelBinder para combinar los resultados de los tres campos de texto en un único campo de número de teléfono, que puede decorarse con atributos de validación. Aquí hay una pregunta de stackoverflow que tiene un ejemplo de cómo hacer esto: DataAnnotation Validations y Custom ModelBinder