2011-01-20 15 views
5

creé un atributo heredado como este en ASP.NET MVC3:La validación del lado del cliente no funciona cuando inhert desde RequiredAttribute en ASP.NET MVC 3?

public sealed class RequiredFromResourceAttribute : RequiredAttribute 
{ 
    public RequiredFromResourceAttribute(string errorResourceName, string errorResourceTypeName) 
    { 
     this.ErrorMessageResourceName = errorResourceName; 
     this.ErrorMessageResourceType = Type.GetType(errorResourceTypeName); 
    } 
} 

Y utilizar de esta manera:

[RequiredFromResource("Title", "Resources.Resource, MyProject.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")] 
public string Title { get; set; } 

No funcionó y el MVC ignoró. Luego de crear una clase más simple, que acaba de heredar de RequiredAttribute así:

public class MyRequiredAttribute : RequiredAttribute 
{ 
} 

lo uso como que dije. Pero no funcionó de nuevo.

Aunque, todas estas formas funcionan perfectamente en "DisplayNameAtrribute".

¿Cuál es el problema?

+0

En mi opinión, la respuesta de marcind maneja esto mejor que SkipHarris '. El RequiredAttributeAdapter en Skip's parece causar que la validación del lado del cliente use el atributo Requerido normal en lugar del RequiredFromResourceAttribute. – Keerigan

Respuesta

3

Puedes solucionar este problema añadiendo el siguiente código en Global.asax: (encontrado la respuesta here)

DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(RequiredLocalizableAttribute), typeof(RequiredAttributeAdapter)); 

Alternativamente, usando la solución de marcind, encontré que el constructor para ModelClientValidationRequiredRule requiere un mensaje de error. Aquí hay una versión actualizada que incluye el nombre de visualización para el campo:

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
    { 
     string msg = FormatErrorMessage(metadata.GetDisplayName()); 
     yield return new ModelClientValidationRequiredRule(msg); 
    } 
+0

La respuesta de @marcy parece manejar esto mucho mejor. El uso de RequiredAttributeAdapter parece llamar al atributo obligatorio habitual en lugar del personalizado. – Keerigan

+0

La respuesta de Skip parece funcionar bien para mí. Gracias Skip. –

3

Es solo la validación del lado del cliente que no funciona con los atributos heredados. El motivo es que MVC usa una estricta igualdad de tipos al asignar atributos del lado del servidor a los comportamientos de validación del cliente.

Para evitar este tendrá que tener su atributo personalizado para implementar IClientValidatable:

public class MyRequiredAttribute : IClientValidatable { 
    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { 
     yield return new ModelClientValidationRequiredRule(); 
    } 
} 
+1

Entonces, ¿por qué funciona de la misma manera en MVC2? –

+1

Esta es una forma mucho mejor de manejar esto que @SkipHarris '. El uso de RequiredAttributeAdapter parece llamar al atributo obligatorio habitual en lugar del personalizado. – Keerigan

Cuestiones relacionadas