2010-11-14 7 views
1

Ouais, je sais, cette question a été posée/répondu 34798796873.5 fois. J'ai regardé à travers les 3 bajillion d'entre eux, et j'ai toujours le problème. Qu'est-ce que j'oublie ici?DropDownListPour la sélection ne fonctionne pas - encore

J'ai essayé plusieurs approches et aucune d'entre elles ne fonctionne. Voici mes dernières tentatives:

<%:Html.DropDownList("Author", 
    Model.AuthorItems.Select(i => 
     new SelectListItem 
     { 
      Text = i.Name, 
      Value = i.Id.ToString(), 
      Selected = i.Id == Model.Author.Id 
     }), "無し")%> 

<%:Html.DropDownListFor(m => m.Author, 
    new SelectList(Model.AuthorItems, 
     "Id", 
     "Name", 
     Model.Author), 
    "無し") %> 

Mon modèle de vue est très simple:

public class EditArticleViewModel 
{ 
    public AuthorItem Author { get; set; } 

    public IList<AuthorItem> AuthorItems { get; set; } 
    public class AuthorItem 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
    } 
} 

Je me suis assuré mon action fonctionne correctement; En effet, Auteur a un Id de 5, et AuthorItems a une entrée dont l'Id est 5.

J'ai même essayé de surcharger Equals et GetHashCode dans le modèle.

Blahhhhh !! 1

Répondre

6

Selon vous modèle remplacer:

public AuthorItem Author { get; set; } 

avec

public int? SelectedAuthorId { get; set; } 

et dans votre vue lier la liste déroulante à ce SelectedAuthorId:

<%:Html.DropDownListFor(
    m => m.SelectedAuthorId, 
    new SelectList(Model.AuthorItems, "Id", "Name"), 
    "無し" 
) %> 

Maintenant aussi longtemps que vous fournissez une valeur SelectedAuthorId valide dans votre action de contrôleur:

model.SelectedAuthorId = 123; 

L'aide HTML qui rend le menu déroulant sera correctement l'élément de pré-sélectionner la liste qui a cette id donné. La raison en est que dans une liste déroulante, vous ne pouvez sélectionner qu'une seule valeur (un type scalaire) et non un auteur entier (tout ce qui est envoyé dans la requête HTTP lorsque vous soumettez le formulaire est cette valeur sélectionnée). .

+0

Eh bien c'était rapide. Aucune idée pourquoi cela fonctionne et aucune des autres approches, mais merci! –

+1

Quelles autres approches? Vous ne pouvez pas lier une liste déroulante à un objet complexe (Auteur dans votre cas), ce que vous essayiez de faire. Si vous souhaitez récupérer l'auteur correspondant dans votre action POST, utilisez l'ID fourni pour le récupérer dans la base de données. –

0

DropDownList/DropDownListPour utiliser la valeur ModelState. Définissez donc ViewDataDictionary selectedValue dans le contrôleur.

public ActionResult Index() 
{ 
    var model = new EditArticleViewModel 
      { 
      Author = new EditArticleViewModel.AuthorItem() {Id = 3, Name = "CCC"}, 
      AuthorItems = new List<EditArticleViewModel.AuthorItem>() 
      { 
       new EditArticleViewModel.AuthorItem() {Id = 1, Name = "AAA"}, 
       new EditArticleViewModel.AuthorItem() {Id = 2, Name = "BBB"}, 
       new EditArticleViewModel.AuthorItem() {Id = 3, Name = "CCC"}, 
       new EditArticleViewModel.AuthorItem() {Id = 4, Name = "DDD"}, 
      } 
      }; 

    ViewData["Author"] = model.Author.Id; 
    return View(model); 
} 

Voir le code simple.

<%:Html.DropDownList("Author", 
     new SelectList(Model.AuthorItems, 
      "Id", 
      "Name"), "無し")%> 

<%:Html.DropDownListFor(m => m.Author, 
    new SelectList(Model.AuthorItems, 
     "Id", 
     "Name"), 
    "無し")%> 

La clé ViewData "Auteur" utilise la liaison d'état de modèle pour la valeur sélectionnée.

Espérons cette aide.

Questions connexes