Les noms des types de Validation dans les règles discrètes de validation du client doivent être uniques

Les noms des types de Validation

dans les règles discrètes de validation du client doivent être unique. Le type de validation suivant a été vu plus d'une fois: obligatoire

se réfère à la propriété EmailAddress, ici:

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; }
}

Je n'utilise pas le même type de règle de validation deux fois ici. Cela fonctionne très bien localement, mais pas lorsqu'il est déployé sur le serveur. Quel est le problème?

j'ai ajouté un référence à DataAnnotationExtensions ( http://dataannotationsextensions.org ), cela pourrait-il causer un problème?

modifier: supprimer la référence n'a pas réglé le problème. Il semble que quelque chose ait pu être foiré avec la configuration de L'IIS?

30
demandé sur Josh M. 2012-03-17 04:34:47

4 réponses

JimmiTh le commentaire de sur la question a fourni un aperçu pour moi de résoudre cela pour moi.

dans mon cas, j'ai certainement ajouté un fournisseur supplémentaire à ModelValidatorProviders . J'ai ajouté une usine de validation personnalisée (en utilisant validation fluente ) avec ce code dans mon Global.asax.cs fichier:

ModelValidatorProviders.Providers.Add(
    new FluentValidationModelValidatorProvider(validatorFactory));

mais utiliser plusieurs fournisseurs n'est pas nécessairement problématique. Ce qui semble problématique est que si plusieurs fournisseurs fournissent les mêmes validateurs, parce que cela va enregistrer les mêmes règles plusieurs fois, causant le problème mentionné avec le code de validation discret de Microsoft.

j'ai fini par supprimer la ligne suivante du même fichier car j'ai décidé que je n'avais pas besoin d'utiliser les deux fournisseurs:

FluentValidationModelValidatorProvider.Configure();

la méthode Configure ci-dessus ajoute elle-même un fournisseur à ModelValidatorProviders , et j'enregistrais effectivement la même classe de validateur deux fois, d'où l'erreur sur les "noms de type de validation"non uniques.

DONC, la question jquery à l'aise avec les Validations. Erreur: les noms de type de Validation dans les règles discrètes de validation du client doivent être uniques indique une autre façon que l'utilisation de plusieurs fournisseurs peut conduire au problème mentionné. Chaque fournisseur peut être configuré pour ajouter un attribut "implicite requis" à "types de valeur" (c'est-à-dire vue les propriétés du modèle qui ne sont pas nulles). Pour résoudre ce problème particulier, je pourrais changer mon code à ce qui suit de sorte qu'aucun des fournisseurs n'Ajoute les attributs implicites requis:

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; 
16
répondu Kenny Evitt 2017-05-23 12:02:02

mon cas était que j'avais

.NotEmpty()

et

.NotNull()

en même temps, un seul est nécessaire.

6
répondu PmanAce 2016-06-22 20:38:14

si vous utilisez FluentValidation côte à côte avec DataAnnotations cela peut arriver.

lorsque FluentValidation est en action, vous pouvez avoir besoin de supprimer Modelvalidatorprovider de données des fournisseurs de Modelvalidator enregistrés dans la méthode Application_Start.

FluentValidationModelValidatorProvider.Configure(); 
// Remove data annotations validation provider 
ModelValidatorProviders.Providers.Remove(
            ModelValidatorProviders.Providers.OfType<DataAnnotationsModelValidatorProvider>().First());
2
répondu Veysel Özdemir 2016-09-21 19:23:03

s'il vous plaît, mettez à jour le web.fichier de configuration:

<configuration>
    <appSettings>
        <add key="ClientValidationEnabled" value="true"/>
        <add key="UnobtrusiveJavaScriptEnabled" value="true"/>
    </appSettings>
</configuration>
0
répondu jainvikram444 2015-09-24 20:28:43