2017-07-21 2 views
1

Voici comment je remplir dropdownlist et créer l'élément html;comment lier selectlistitem valeur dans dropdownlist à la propriété de la chaîne dans le modèle

AccountController:

 public ActionResult Index() 
     { 
      ViewBag.Towns = new SelectList(_skrsService.GetTowns(), "Value", "Text", 1); 
      return View(); 
     } 
... 

public List<SelectListItem> GetTowns() 
     { 
      var list = UnitOfWork.Repository<SkrsIl>().OrderBy(x => x.Adi).Select(x => new SelectListItem() 
      { 
       Text = x.Adi, 
       Value = x.Kodu.ToString() 
      }).ToList(); 
      return list; 
     } 

Login.cshtml (Ville natale est le champ de chaîne dans le modèle bindned page de connexion de vue):

@Html.DropDownListFor(x => x.Hometown, ((SelectList)ViewBag.Towns), new { @class = "form-control", placeholder = "Doğum Yeri" }) 

Je me attendais que cela fonctionne, mais obtenir une erreur, un message:

"L'élément ViewData qui a la clé 'Ville d'origine' est de type 'System.String' mais doit être de tapez 'IEnumerable < SelectListItem>'. "

Comment puis-je le faire fonctionner correctement? Je m'attendais juste à ce que la valeur de l'item selectem soit affectée à la propriété 'Hometown'

+1

Cela signifie que la valeur de 'viewBag.Towns' est' null' - référez-vous à [cette réponse] (https://stackoverflow.com/questions/34366305/the-viewdata-item-that-has-the-key -xxx-est-de-type-système-int32-mais-doit-être-o). Et en remarque, l'utilisation de 'new SelectList()' est un surcoût inutile - vous créez un 'IEnumerable ' identique et le 4ème paramètre du constructeur est ignoré - c'est la valeur de 'Hometown' qui détermine ce qui est sélectionné –

+0

Bonjour, votre commentaire contient plus que j'ai besoin, je l'accepte avec joie si vous postez cela comme réponse Merci! – TyForHelpDude

Répondre

1

L'erreur signifie que ViewBag.Towns est null. Lorsque le deuxième paramètre (IEnumerable<SelectListItem> selectList) est null, la méthode s'attend à ce que le premier paramètre soit de type IEnumerable<SelectListItem>. Comme vous l'avez affecté dans la méthode GET, cela se produit presque certainement lorsque vous soumettez votre formulaire et que vous avez renvoyé la vue mais que vous n'avez pas repeuplé la valeur ViewBag.Towns comme vous l'avez fait dans la méthode GET.

En remarque, l'utilisation de new SelectList() est un surcoût inutile: elle crée simplement une autre IEnumerable<SelectListItem> basée sur la première. En outre, le quatrième paramètre du constructeur SelectList est ignoré lorsque vous liez à une propriété de modèle. En interne, la méthode génère un nouveau IEnumerable<SelectListItem> et définit la propriété Selected en fonction de la valeur de la propriété à laquelle vous vous liez.

Votre code contrôleur doit être

public ActionResult Index() 
{ 
    ViewBag.Towns = _skrsService.GetTowns(); 
    return View(); // ideally you should be returning a model 
} 
[HttpPost] 
public ActionResult Index(YourModel model) 
{ 
    if (!ModelState.IsValid) 
    { 
     ViewBag.Towns = _skrsService.GetTowns(); // re-populate the SelectList 
     return View(model); 
    } 
    // save and redirect 
} 

Mais de préférence, vous devriez utiliser un modèle de vue contenant une propriété pour la liste de sélection plutôt que ViewBag.