2 votes

DropDownListFor pour un modèle complexe ayant des problèmes de validation

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">

-1voto

Wahid Bitar Points 3482

Parce qu'elle n'est pas nulle du tout. Si vous voulez que la validation côté client fonctionne, vous devez autoriser l'utilisation de l'élément ForeignId doit être null non 0 et que lorsque vous créez le DropDown en premier lieu

new SelectList(
 Model.Containers.Values,
 "Id",
 "DisplayFields",
 0 // Don't set this default value
)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X