2012-03-17 10 views
25

I nomi dei tipi di convalida nelle regole di convalida del client non invadenti devono essere univoci. Il seguente tipo di convalida è stato visto più di una volta: richiestoI nomi dei tipi di convalida nelle regole di convalida del client non invadenti devono essere univoci

Questo si riferisce alla proprietà EmailAddress, qui:

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

non sto usando lo stesso tipo di regola di convalida per due volte qui. Funziona bene localmente, ma non quando è distribuito sul server. Qual è l'accordo?

Ho aggiunto un riferimento a DataAnnotationExtensions (http://dataannotationsextensions.org), potrebbe causare un problema?

Modifica: rimozione del riferimento non ha risolto il problema. Sembra che qualcosa potrebbe essere incasinato con la configurazione di IIS?

+0

Sto anche utilizzando le estensioni di dataannotations e non ho alcun problema. L'unica differenza che vedo è che hai l'attributo "AdditionalMetadata" in uso che non ho mai usato. Prova a rimuoverlo e vedere se ha ancora errori? –

+0

Nessuna fortuna. Questo codice ha funzionato bene prima (non ho cambiato questo modello). Funziona bene localmente, solo non quando è distribuito sul server. –

+1

Ho trovato questo link, potrebbe far luce. http://fluentvalidation.codeplex.com/workitem/7072 –

risposta

0

prega, aggiornare il file web.config:

<configuration> 
    <appSettings> 
     <add key="ClientValidationEnabled" value="true"/> 
     <add key="UnobtrusiveJavaScriptEnabled" value="true"/> 
    </appSettings> 
</configuration> 
14

JimmiTh's comment sulla questione ha fornito un'intuizione fondamentale per me per risolvere questo per me stesso.

Nel mio caso, ho sicuramente aggiunto un provider aggiuntivo a ModelValidatorProviders. Ho aggiunto una fabbrica di convalida personalizzato (utilizzando Fluent Validation) con questo codice nel mio file Global.asax.cs:

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

Ma usando diversi operatori di non è necessariamente problematico. Ciò che sembra essere problematico è se più provider forniscono gli stessi validatori, poiché registreranno le stesse regole più volte, causando il problema menzionato con il codice di convalida discreto di Microsoft.

ho finito di rimuovere la seguente riga dallo stesso file come ho deciso che non ho avuto bisogno di usare entrambi i fornitori:

FluentValidationModelValidatorProvider.Configure(); 

Il metodo Configure di cui sopra è in sé l'aggiunta di un provider a ModelValidatorProviders, e io ero registrare efficacemente la stessa classe di validatori due volte, da cui l'errore relativo ai "nomi dei tipi di convalida" non univoci.

La domanda SO jquery - Fluent Validations. Error: Validation type names in unobtrusive client validation rules must be unique indica un altro modo in cui l'utilizzo di più provider può portare al problema menzionato. Ogni provider può essere configurato per aggiungere un 'attributo implicito richiesto a' tipi di valore '(ad esempio, visualizzare le proprietà del modello che non sono annullabili). Per risolvere questo problema particolare, ho potuto cambiare il mio codice di seguito in modo che nessuno dei fornitori aggiungere impliciti attributi richiesti:

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

Il mio caso era che avevo

.NotEmpty() 

e

.NotNull() 

allo stesso tempo, ne è necessario solo uno.

+0

grazie per la risposta. –

1

Se si utilizza FluentValidation accanto a DataAnnotations, ciò può accadere.

Quando FluentValidation è in azione, potrebbe essere necessario rimuovere DataAnnotationsModelValidatorProvider dai ModelValidatorProvider registrati nel metodo Application_Start.

FluentValidationModelValidatorProvider.Configure(); 
// Remove data annotations validation provider 
ModelValidatorProviders.Providers.Remove(
      ModelValidatorProviders.Providers.OfType<DataAnnotationsModelValidatorProvider>().First()); 
Problemi correlati