He creado un atributo de validación CompareLessThan personalizada copiando el ASP.NET MVC 3 CompareAttribute y en lugar de la comprobación de la igualdad, que verifique que una propiedad es menor que otro. Si hay un error en el lado del cliente, el mensaje '{0} debe ser menor que {1}' se muestra al usuario.ASP.NET MVC ValidationAttribute Obtener Display Otros Nombre de propiedad
Mi modelo se configura de la siguiente manera con los atributos de Pantalla que hacen referencia a un archivo de recursos.
[CompareLessThan("AmountAvailable", ErrorMessageResourceName="CompareLessThan", ErrorMessageResourceType = typeof(Resources.ValidationMessages))]
[Display(Name = "Amount", ResourceType = typeof(Resources.Labels))]
public decimal Amount { get; set; }
[Display(Name = "AmountAvailable", ResourceType = typeof(Resources.Labels))]
public decimal AmountAvailable { get; set; }
A continuación, el método de validación GetClientValidationRules personalizada es exactamente el mismo que en el CompareAttribute
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
yield return new ModelClientValidationLessThanRule(FormatErrorMessage(metadata.DisplayName), FormatPropertyForClientValidation(OtherProperty), this.AllowEquality);
}
Aquí estamos generando el mensaje de error que se mostrará al usuario si hay un problema. Puedo obtener el nombre para mostrar del archivo de recursos para la propiedad que está decorada con mi atributo personalizado CompareLessThan, pero mi pregunta es ¿cómo hago para obtener el nombre para mostrar de la propiedad 'otra' con la que estamos comparando? En el método IsValid tenemos una referencia a la validationContext de la que puede generar un objeto PropertyInfo para el 'otro' propiedad y creo que obtener el nombre de visualización. Pero, en GetClientValidationRules no tengo acceso a eso.
Siempre podría pasar otro valor para el nombre para mostrar de la otra propiedad pero esperaba que hubiera una forma de derivarlo, ya que lo estoy especificando con anotaciones de datos.
¿Alguna idea?
Buena idea, pero la colección Propiedades siempre está vacía. –
@NickOlsen Eso es triste. Actualicé mi respuesta con alguna "solución alternativa". – nemesv
Eso tampoco funciona como metadata. La propiedad del modelo es solo el valor 0. Usando su lógica, pude encontrar otra manera de hacerlo (ver otra respuesta) pero realmente no me gusta. Espero que haya una mejor manera que otra persona pueda brindar. –