Domanda

Io uso fluentementeValidation per convalidare i miei quadro di vista MY ASP.NET MVC 5.1 (utilizzando la convalida del lato client non invadente predefinito). I Registrato / Crea i miei validatori tramite Ninject (senza attributi sui miopia):

FluentValidationModelValidatorProvider.Configure(x => x.ValidatorFactory = new NinjectValidatorFactory(_kernel));
AssemblyScanner.FindValidatorsInAssembly(Assembly.GetExecutingAssembly()).ForEach(match => _kernel.Bind(match.InterfaceType).To(match.ValidatorType));
.

Ho una vista parziale che viene utilizzata spesso in tutta l'applicazione. Questa vista parziale ha il proprio moschettone. Il punto di vista "principale" (quello per l'intera vista) semplicemente eredita da questa visione "parziale".

public class IndexViewModel : PersonalInfoViewModel { ... }
.

Lo stesso schema viene utilizzato sui validatori:

public class IndexValidator : PersonalInfoValidator { ... }
.

funziona bene e la convalida del lato server funziona così come la convalida del lato client sulla vista "principale". Ma la convalida del lato client sulla vista parziale non è attivata (nessun attributo di generazione di data-val-* sui campi di input lì).

La mia vista "principale" Index.cshtml

@model IndexViewModel
@Html.TextBoxFor(x => x.SomeProperty) // client-side validation works fine

@Html.Partial("PersonalInfo") // client-side validation in the partial view does not work (see below)
.

La mia vista parziale PersonalInfo.cshtml:

@model PersonalInfoViewModel
@Html.TextBoxFor(x => x.FirstName) // client-side validation does not work
.

Ho notato che funziona quando modifico il modello per la vista parziale alla visione "principale":

@model IndexViewModel
@Html.TextBoxFor(x => x.FirstName) // client-side validation works
.

Quindi indovro da qualche parte quando si costruisce la convalida del lato client, il corretto validatore non viene raccolto e non vengono iniettati gli attributi data-val-* nell'HTML. Ma non riesco a cambiare il mirino sulla vista parziale, perché è usato su diverse pagine con diverse viste "principali" (tutte eredita da PersonalInfoViewModel però).

Qualche idea su come ottenere la convalida del lato client che lavora in questo caso?

Aggiornamento

Dopo alcune ore di scavata attraverso l'origine WebStack ASP.NET, ho scoperto che il problema sembra verificarsi nel metodo TextBoxFor. Lì il ModelMetaData viene creato dal modello - e lì da qualche parte inizia a utilizzare IndexViewModel anziché PersonalInfoViewModel per ottenere i metadati per la convalida del lato client:

ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
Html.GetUnobtrusiveValidationAttributes("FirstName", metadata); // no client-side validation attributes found
.

Ma questo genera gli attributi di convalida del lato client corretti se non specifico i metadati esplicitamente:

Html.GetUnobtrusiveValidationAttributes("FirstName");
.

Sfortunatamente, non ho trovato un modo per usare questa conoscenza per il mio vantaggio finora.

È stato utile?

Soluzione

Non sono stato in grado di trovare una bella soluzione al mio problema, e non volevo più giocare con la sorgente WebStack ASP.net, quindi ho sistemato con una brutta soluzione:

I "Manualmente" iniettare gli attributi data-val-* mancanti durante il rendering dei campi di input, in questo modo:

@Html.TextBoxFor(x => x.FirstName, Html.GetUnobtrusiveValidationAttributes("FirstName"))
.

Poiché GetUnobtrusiveValidationAttributes (chiamato stand-alone) crea gli attributi HTML corretti che li prendo e aggiungilo a TextBox.Sicuramente non bello, ma funziona e posso andare avanti con il mio lavoro.Se qualcuno ha una soluzione migliore, sarei molto felice di sentirlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top