side net mvc example custom asp asp.net-mvc localization asp.net-mvc-4 model-binding

asp.net-mvc - net - mvc validation model



MVC 4 ignora DefaultModelBinder.ResourceClassKey (1)

Agregar un archivo de recursos a App_GlobalResources con una clave PropertyValueRequired y cambiar DefaultModelBinder.ResourceClassKey al nombre de archivo no tiene efecto en MVC 4. La cadena The {0} field is required nunca cambia. No quiero configurar el tipo de clase de recurso y la clave en cada campo requerido. ¿Me estoy perdiendo de algo?

Editar:

Realicé una pequeña modificación en el código de Darin Dimitrov para que las personalizaciones requeridas funcionen:

public class MyRequiredAttributeAdapter : RequiredAttributeAdapter { public MyRequiredAttributeAdapter( ModelMetadata metadata, ControllerContext context, RequiredAttribute attribute ) : base(metadata, context, attribute) { if (attribute.ErrorMessageResourceType == null) { attribute.ErrorMessageResourceType = typeof(Messages); } if (attribute.ErrorMessageResourceName == null) { attribute.ErrorMessageResourceName = "PropertyValueRequired"; } } }


Esto no es específico de ASP.NET MVC 4. Fue lo mismo en ASP.NET MVC 3. No puede establecer el mensaje requerido usando DefaultModelBinder.ResourceClassKey , solo el PropertyValueInvalid .

Una forma de lograr lo que está buscando es definir un RequiredAttributeAdapter personalizado:

public class MyRequiredAttributeAdapter : RequiredAttributeAdapter { public MyRequiredAttributeAdapter( ModelMetadata metadata, ControllerContext context, RequiredAttribute attribute ) : base(metadata, context, attribute) { attribute.ErrorMessageResourceType = typeof(Messages); attribute.ErrorMessageResourceName = "PropertyValueRequired"; } }

que se registrará en Application_Start :

DataAnnotationsModelValidatorProvider.RegisterAdapter( typeof(RequiredAttribute), typeof(MyRequiredAttributeAdapter) );

Ahora, cuando a un campo que no App_GlobalResources no se le asigna un valor, el mensaje de error vendrá de Messages.PropertyValueRequired donde Messages.resx debe definir dentro de App_GlobalResources .