DropDownListFor ne sélectionne pas la valeur si in for loop

À mon avis

<%= Html.DropDownListFor( x => x.Countries[ i ], Model.CountryList )%>

dans mon contrôleur

public int[ ] Countries { get; set; }

public List<SelectListItem> CountryList { get; set; }

lorsque les formulaires sont affichés, il n'y a aucun problème, la liste déroulante est remplie et les valeurs sélectionnées par l'utilisateur sont affichées. Mais quand j'essaie de charger le formulaire avec les valeurs assignées aux Pays[ ] ne pas être sélectionnée.

21
demandé sur Craig McKeachie 2010-04-13 20:40:32

6 réponses

j'ai la même chose aussi. Lors de l'utilisation de foreach pour boucler une DropDownListFor (c'est-à-dire pour rendre plusieurs éléments select sur une page).

Mon travail est de définir la valeur sélectionnée dans le contrôleur plutôt que de la vue: quelque chose comme ceci:

dans le contrôleur:

public class FruitList 
{        
    public int? selectedFruit{ get; set; }
    public List<SelectListItem> fruits
    {
        get
        {
            fruitEntities F = new fruitEntities();
            List<SelectListItem> list = (from o in F.Options
                                         select new SelectListItem
                                         {
                                             Value = o.fruitID,
                                             Text = o.fruit,                                                 
                                             Selected = o.fruitID == selectedFruit
                                         }).ToList();
            return list;
        }
    }
}

public class ViewModel 
{              
    public List<FruitList> collectionOfFruitLists { get; set; }        
}

Dans la vue.

<table>                        
   <% for (int i=0; i < Model.collectionOfFruitLists.Count; i++ )
        { %>
        <tr>                            
            <td><%: Html.DropDownList("fruitSelectList", collectionOfFruitLists[i].fruits, "Please select...") %></td>                
        </tr>
        <%} %>
 </table>

La chouette bits est Selected = o.fruitID == selectedFruit dans le controller qui agit comme une instruction de cas SQL; ceci est très bien expliqué par Lance Fisher (merci de Lance, votre post m'a vraiment aidé :)

10
répondu Neil Billingham 2012-08-30 18:23:08

Je ne sais pas si c'est nouveau pour mv4 ou s'il existe dans la version précédente. Mais le DropDownListFor inclut un paramètre supplémentaire pour le constructeur SelectList.

SelectList(IEnumerable, String, String, Object)

Par exemple:

Html.DropDownListFor( x => x.Countries[ i ], New SelectList(Model.CountryList,"ID","Description",Model.Countries[i]))

ID est le code Pays dans le CountryList et Description est le Nom du Pays.

20
répondu Nick 2013-04-09 14:27:53

je sais que cette question est un peu vieille mais je viens de rencontrer ce problème avec la boucle à travers une liste d'objets et tenter de lier les valeurs à DropDownListFor(s) dans ma vue Edit.

j'ai surmonté le problème avec une solution en ligne en utilisant la logique de certaines des solutions précédentes données par d'autres pour cette question.

Liaison à mon Modèle:

@Html.DropDownListFor(model => model.QuestionActions[i].QuestionActionTypeId,
      Model.QuestionActionTypes.Select(x => new SelectListItem() { Value = x.Value, Text = x.Text, Selected = (x.Value == Model.QuestionActions[i].QuestionActionTypeId.ToString()) }).ToList(),
          "Select Action Type",
                 new { })

Modèle.QuestionActionTypes est une SelectList qui est générée dans mon Controller.

5
répondu Kevin Dark 2016-08-30 20:41:54

C'est un peu un piratage, et dépendant de JavaScript, mais ça a très bien marché pour moi.

vous aurez besoin de connaître les Id des clients qui seront produits par les champs (habituellement, ceux-ci peuvent être travaillés manuellement, mais pour la sécurité Vous pouvez vouloir utiliser quelque chose comme un FieldIDFor method.

Vous avez juste besoin de définir les valeurs basées sur le modèle, dans le $(document) de jQuery.prêt:

<script type="text/javascript">
    $(document).ready(function () {
        @for(var i = 0; i < 5; i++)
        {
            <text>
                $("#@Html.FieldIDFor(m => m.Countries[i])").val("@Model.Countries[i]");
            </text>
        }
    });
</script>
0
répondu rashleighp 2012-01-11 17:00:15

une boîte de sélection envoie une seule valeur, donc le Countries propriété ne doit pas être un tableau. Également dans votre post, il n'est pas clair où est le i variable que vous utilisez dans votre expression lambda venant de et ceci x.CountryList utilisé dans le helper ne compile pas x n'est pas défini.

Modèle:

public class MyModel
{
    public int SelectedCountry { get; set; }
    public List<SelectListItem> CountryList { get; set; }
}

Vue:

<%= Html.DropDownListFor(x => x.SelectedCountry, Model.CountryList) %>

mise à jour:

Selon le commentaire, il semble qu'il y a plusieurs menus déroulants. Je pensez que le problème pourrait venir de la i variable utilisée comme indice dans un for boucle.

Vous pouvez essayer ceci à la place:

Modèle:

public class MyModel
{
    public int[] Countries { get; set; }
    public List<SelectListItem> CountryList { get; set; }
}

Vue:

<% foreach (var country in Model.Countries) { %>
    <%= Html.DropDownListFor(x => country, Model.CountryList) %>
<% } %>
-1
répondu Darin Dimitrov 2010-04-13 17:41:43
public List<PairVM<string,string>> TiposValorCobertura { get; private set; }

et dans votre vue quand vous assignez les éléments sélectionnables pour la dropdownlist dans la boucle, faites le de cette façon:

@Html.DropDownListFor(m => m.Coberturas[i].TipoLimiteInferior, new SelectList(Model.TiposValorCobertura,"Key","Description",  Model.Coberturas[i].TipoLimiteIferior))

où "clé" et "Description" sont les propriétés de PairVM

-1
répondu user3218809 2017-03-09 17:34:45