J'ai d'autres champs et des listes déroulantes dans un formulaire de saisie. Ils sont tous validés correctement. Même les deux éléments qui ne sont pas correctement validés par le front-end le sont toujours par le model bind dans un post. Je ne sais pas exactement pourquoi ils ne sont pas validés. Voici la configuration :
Modèle de vue
public class DataVM
{
//Widgets used, populated from database
public List<Widget> Widgets { get; set; }
//Contains data to populate a dropdown with
public GenericSelectList Containers { get; set; }
//This will hold the relation between the widget and container
//where widget is the local id, and container foreign id
public List<NestedDictionary> WidgetContainers { get; set; }
}
public class NestedDictionary
{
[RegularExpression("/^[1-9][0-9]*$/")]
[Required]//This is not being enforced
public int? ForeignId { get; set; }
public int LocalId { get; set; }
}
Voir
@for (int i = 0; i < Model.Widgets.Count; i++)
{
@Html.Hidden("WidgetContainers["+i+"].LocalId", Model.Widgets.ElementAt(i).WidgetId)
<div>
<div>
<span>Container Used</span><hr />
</div>
<div class="editor-field">
@Html.DropDownListFor(
m => m.WidgetContainers.ElementAt(i).ForeignId,
new SelectList(
Model.Containers.Values,
"Id",
"DisplayFields",
0
),
" - Select A Container - "
)
<br />@Html.ValidationMessageFor(model => model.WidgetContainers.ElementAt(i).ForeignId)
</div>
</div>
}
Tout s'affiche correctement. Il est interactif et les valeurs sont correctes. Lors de l'affichage, les données correctes sont transmises aux bons endroits. Cependant, si aucun conteneur n'est sélectionné, l'enregistrement se fait correctement, avec une valeur de 0
passé. Je suis un peu perdu. Une idée de la raison pour laquelle la validation ne fonctionne pas côté client ?
EDITAR
Voici le rendu html de l'entrée cachée et de l'élément de sélection
cachés :
<input id="WidgetContainers_0__LocalId" type="hidden" value="39" name="WidgetContainers[0].LocalId">
sélectionner :
<select name="ForeignId" id="ForeignId" class="valid">
Il est clair que les attributs de la sélection doivent être différents.
Editer #2
Si j'utilise
m => m.WidgetContainers[i].ForeignId,
puis j'obtiens
<select id="WidgetContainers_0__ForeignId" name="WidgetContainers[0].ForeignId" class="valid">