5

Sto cercando un modo per implementare la convalida personalizzata discreta per Fluent Validation. Secondo lo documentation, non sembra indicare che supporti la convalida non invadente.Convalida personalizzata/condizionale discreta con Fluent Validation

Lo stesso si applica all'utilizzo della convalida condizionale (When/Unless). Vedo nella loro MVC documentation, convalida discreto non è supportato condizionale e altre convalida complesso:

noti che FluentValidation funziona anche con la convalida lato client di ASP.NET MVC, ma non sono supportate tutte le regole. Ad esempio, le regole definite utilizzando una condizione (con When/Unless), i validatori personalizzati o le chiamate a Must non verranno eseguite sul lato client. I seguenti validatori sono supportate sul client:

* NotNull/notempty
* Risultati (regex)
* InclusiveBetween (range)
* Carta di Credito
* Email
* equalTo (confronto di uguaglianza cross-proprietà)
* Lunghezza

Così qualcuno ha capito come ottenere questo lavoro? In caso contrario, esistono altre opzioni di convalida che forniscono un supporto migliore per la convalida personalizzata/complessa non intrusiva?

+0

Potrebbe fornire un esempio concreto di ciò che stai cercando di ottenere/convalidare? Qual è il tuo scenario esatto? –

+0

Bene, usare solo i metodi When/Unless non funziona in modo discreto, fuori dalla scatola comunque.Anche se potessi trovare una soluzione che funzionasse per quelli, ciò mi porterebbe ad un passo in avanti. Probabilmente, se funziona con condizionali come When/Unless, probabilmente funzionerebbe anche con la validazione personalizzata. –

risposta

1

Ho collegato correttamente FluentValidation a ASP.NET MVC 3, seguendo i documenti Integration with ASP.NET MVC.

Il modo più semplice è quello di collegare FluentValidation nel framework MVC di convalida in Global.asax Application_Start() in questo modo:

FluentValidationModelValidatorProvider.Configure(); 

Quindi è possibile decorare le classi POCO con l'attributo, specificando il validatore che utilizzano.

[Validator(typeof(PersonValidator))] 
public class Person { 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Email { get; set; } 
    public int Age { get; set; } 
} 

Nel mio caso, non volevo farlo (uso attributi), e in realtà necessario per convalidare la stessa classe POCO contro diversi validatori, a seconda delle regole di business.

Se si desidera selezionare diversi validatori in questo modo, seguire i documenti su "custom validator factory with an IoC container". Creare una classe sottoclasse FluidMvcValidatorFactory ValidatorFactoryBase, che implementa l'interfaccia IValidatorFactory. La fabbrica di validatori personalizzati può gestire la selezione del validatore appropriato.

Stavo cercando di far funzionare la validazione lato client (lo ha fatto), ma sembra anche inserirsi in una convalida non invadente. Il mio html è uscita simile a questo:

<input type="text" value="" name="Email" id="Email" data-val-length-max="128" data-val-length="&amp;#39;Email&amp;#39; must be between 0 and 128 characters." data-val-email="&amp;#39;Email&amp;#39; is not a valid email address." data-val="true" class="text-box single-line"> 

Finché si collega in MVC correttamente, penso che discreto dovrebbe funzionare.

In pratica, non si deve dipendere interamente dalla convalida lato client o non invadente, ma solo per assistere l'utente durante l'immissione. In definitiva, il server deve essere convalidato, ma è possibile che il proprio codice lato server utilizzi gli stessi validatori di FluentValidation.

+1

Grazie per il tuo post. In realtà ho una validazione standard che funziona in modo discreto, il problema è ottenere il funzionamento delle convalide condizionali When/Unless o la convalida personalizzata (dove creo le mie regole di convalida). –

+0

Vedo: quindi si desidera definire le regole di convalida personalizzate (condizionali) utilizzando FluentValidation e far sì che tali regole vengano convertite in regole personalizzate jquery.unobtrusive.validation per la convalida lato client? Questo è ciò che non è supportato. Quindi ci vorrebbe un codice personalizzato per colmare il divario. Quanto è importante avere le regole personalizzate sul lato client, non con un post del server? Forse è eccessivo. Parte del motivo per utilizzare FluentValidation è che si scrive meno codice, stesse regole di convalida sul client e sul server. –

+1

Sono d'accordo. Ma ci sono molti casi in cui la convalida di alcuni campi è richiesta solo in alcuni casi (ad esempio richiedono campi di indirizzo di spedizione se la casella di controllo "Uguale alla fatturazione" non è selezionata). Per me, questo sembra un requisito comune e, come hai detto tu, non voglio dover scrivere una convalida separata per questo poiché la convalida non invadente non funziona per questi condizionatori When/Unless. –