asp.net-mvc-3 - solo - validar correo electronico mvc
Los nombres de los tipos de validación en las reglas de validación de clientes no intrusivas deben ser únicos (4)
Los nombres de los tipos de validación en las reglas de validación de clientes no intrusivas deben ser únicos. El siguiente tipo de validación fue visto más de una vez: requerido
Esto se refiere a la propiedad EmailAddress, aquí:
public class LoginModel
{
[Required]
[DataType(DataType.EmailAddress)]
[Display(Name = "Email")]
[AdditionalMetadata("Style", "Wide")]
public string EmailAddress { get; set; }
[Required]
[DataType(DataType.Password)]
[Display(Name = "Password")]
[AdditionalMetadata("Style", "Wide")]
public string Password { get; set; }
}
No estoy usando el mismo tipo de regla de validación dos veces aquí. Esto funciona bien localmente, pero no cuando se implementa en el servidor. ¿Cual es el trato?
DataAnnotationExtensions
una referencia a DataAnnotationExtensions
( http://dataannotationsextensions.org ), ¿podría estar causando un problema?
Edición: eliminar la referencia no solucionó el problema. Parece que algo puede estar desordenado con la configuración de IIS?
Mi caso fue que yo tenía
.NotEmpty()
y
.NotNull()
al mismo tiempo, solo se necesita uno.
Por favor, actualice el archivo web.config:
<configuration>
<appSettings>
<add key="ClientValidationEnabled" value="true"/>
<add key="UnobtrusiveJavaScriptEnabled" value="true"/>
</appSettings>
</configuration>
Si está utilizando FluentValidation junto con DataAnnotations, esto puede suceder.
Cuando FluentValidation está en acción, es posible que deba eliminar DataAnnotationsModelValidatorProvider de los ModelValidatorProviders registrados en el método Application_Start.
FluentValidationModelValidatorProvider.Configure();
// Remove data annotations validation provider
ModelValidatorProviders.Providers.Remove(
ModelValidatorProviders.Providers.OfType<DataAnnotationsModelValidatorProvider>().First());
El comentario de JimmiTh sobre la pregunta me proporcionó una idea clave para resolver esto por mí mismo.
En mi caso, definitivamente ModelValidatorProviders
un proveedor adicional a ModelValidatorProviders
. Agregué una fábrica de validación personalizada (utilizando la validación de Fluent ) con este código en mi archivo Global.asax.cs :
ModelValidatorProviders.Providers.Add(
new FluentValidationModelValidatorProvider(validatorFactory));
Pero usar múltiples proveedores no es necesariamente problemático. Lo que parece ser problemático es si varios proveedores proporcionan los mismos validadores, porque eso registrará las mismas reglas varias veces, causando el problema mencionado con el código de validación discreta de Microsoft.
Terminé eliminando la siguiente línea del mismo archivo, ya que decidí que no necesitaba usar ambos proveedores:
FluentValidationModelValidatorProvider.Configure();
El método de Configure
anterior es, en sí mismo, agregar un proveedor a ModelValidatorProviders
, y efectivamente estaba registrando la misma clase de validador dos veces, de ahí el error sobre los "nombres de tipo de validación" no únicos.
La pregunta de jQuery - Validaciones fluidas. Error: los nombres de los tipos de validación en las reglas de validación de clientes no intrusivas deben ser puntos únicos de otra manera en que el uso de múltiples proveedores puede llevar al problema mencionado. Cada proveedor puede configurarse para agregar un ''atributo obligatorio implícito a'' tipos de valor ''(es decir, ver las propiedades del modelo que no admiten nulos). Para resolver este problema en particular, podría cambiar mi código a lo siguiente para que ninguno de los proveedores agregue atributos obligatorios implícitos:
FluentValidationModelValidatorProvider.Configure(
provider => provider.AddImplicitRequiredValidator = false);
DependencyResolverValidatorFactory validatorFactory =
new DependencyResolverValidatorFactory();
FluentValidationModelValidatorProvider validatorFactoryProvider =
new FluentValidationModelValidatorProvider(validatorFactory);
validatorFactoryProvider.AddImplicitRequiredValidator = false;
ModelValidatorProviders.Providers.Add(validatorFactoryProvider);
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;