2017-03-23 3 views
0

Après https://www.codeproject.com/Articles/702890/MVC-Entity-Framework-and-Many-to-Many-Relation exemple, j'ai l'erreur suivante lors de la publication de mon Edit.cshtml:ListBoxFor « Liste » erreur besoin d'être un « SelectedListItem »

« L'élément ViewData qui a la touche « SelectedTelephoneCellulaires » est de type 'System.Collections.Generic.List' mais doit être de type 'IEnumerable'. "

J'ai cherché en ligne (bien sûr!), Mais les deux plus proches problèmes-réponses connexes (Issues converting types to new selectitemlist & & @Html.DropDownListFor not posting back to controller) n'a pas apporté de solution à mon problème.

est ici une partie de mon ViewModel (sur l'alimentation, par souci de lisibilité):

public partial class EmployeVM 
{   
    public Employe Employe { get; set; } //Employe 

    public IEnumerable<SelectListItem> AllTelephoneCellulaires { get; set; } //TelephoneCellulaire   
    private List<int> _selectedTelephoneCellulaires; 
    public List<int> SelectedTelephoneCellulaires 
    { 
     get 
     { 
      if (_selectedTelephoneCellulaires == null) 
      { 
       _selectedTelephoneCellulaires = Employe.TelephoneCellulaire1.Select(m => m.IdTelephoneCellulaire).ToList(); 
      } 
      return _selectedTelephoneCellulaires; 
     } 
     set { _selectedTelephoneCellulaires = value; } 
    } 
} 

}

Une partie de mon EmployesController (sur le régime aussi bien):

[HttpPost] 
    [ValidateAntiForgeryToken]   
    public ActionResult Edit(EmployeVM employeView) 
    { 
     if (employeView == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 

     if (ModelState.IsValid) 
     { 
      var employeToUpdate = db.Employe 
       .Include(e => e.TelephoneCellulaire1) 
       [...] 
       .First(e => e.IdEmploye == employeView.Employe.IdEmploye); 

      if (TryUpdateModel(employeToUpdate, "Employe", new string[] { "NomEmploye", "PrenomEmploye", "IdTitre", "IdDepartement", "IdSuperviseur", "DateEmbauche", "DateDepart", "StatutEmploye", "IdEmployeur", "IdLocalisation", "Langue", "CarteAcces", "TelephoneCellulaire", "IdTelephoneBureau", "CarteAffaire", "EquipementInformatique", "AdresseCourriel", "GroupeSecurite", "AccesApplicatif", "CodeAlarme", "CleBatiment", "VehiculeCompagnie", "DateNaissance", "IsSuperviseur", "IsActif" })) 
      { 
       var newTelephoneCellulaires = db.TelephoneCellulaire.Where(m => employeView.SelectedTelephoneCellulaires.Contains(m.IdTelephoneCellulaire)).ToList(); 
       [...] 

       var updatedTelephoneCellulaires = new HashSet<int>(employeView.SelectedTelephoneCellulaires); 
       [...] 

       foreach (TelephoneCellulaire telephone in db.TelephoneCellulaire) 
       { 
        if (!updatedTelephoneCellulaires.Contains(telephone.IdTelephoneCellulaire)) 
        { 
         employeToUpdate.TelephoneCellulaire1.Remove(telephone); 
        } 
        else 
        { 
         employeToUpdate.TelephoneCellulaire1.Add(telephone); 
        } 
       } 
       [...] 

       db.Entry(employeToUpdate).State = EntityState.Modified; 
       db.SaveChanges(); 
      } 
      return RedirectToAction("Index"); 
     } 

     if (!ModelState.IsValid) 
     { 
      foreach (var obj in ModelState.Values) 
      { 
       foreach (var error in obj.Errors) 
       { 
        if (!string.IsNullOrEmpty(error.ErrorMessage)) 
         System.Diagnostics.Debug.WriteLine("ERROR WHY = " + error.ErrorMessage); 
       } 
      } 
     } 

     return View(employeView); 
    } 

Et enfin, mon Edit.cshtml (vous l'avez deviné - sur l'alimentation ...)

<div class="form-group"> 
     @Html.LabelFor(model => model.AllTelephoneCellulaires, "Téléphones cellulaires", htmlAttributes: new { @class = "control-label col-md-2" }) 
     <div class="col-md-10">    
      @Html.ListBoxFor(m => m.SelectedTelephoneCellulaires, Model.AllTelephoneCellulaires) 
     </div> 
    </div> 

Les deux réponses précédents adressés au fait que « Model.AllTelephoneCellulaires » causerait l'erreur, mais pas les « m.SelectedTelephoneCellulaires »

La chose la plus drôle est que j'ai pu, il y a un moment, de modifier un sans employé n'importe quel problème, mais quand j'ai essayé d'en éditer un autre (les deux sans toucher à l'entrée 'TelephoneCellulaire'), bang! Voici l'erreur. Je ne comprends tout simplement pas pourquoi je reçois cette erreur? Pourquoi mon SelectedThing devrait être de type "SelectListItem" ?? Et comment je peux le réparer ??? Si quelqu'un est capable de m'aider, je serai pour toujours obligé de vous. En ce moment, je suis caché en train de pleurer sous mon bureau, en suçant mon pouce en position fœtale ...

Répondre

0

Du code que vous avez fourni, je suis très positif que vous receviez cette erreur parce que vous ne transmettez pas une collection SelectListItem valide à la méthode auxiliaire ListBoxFor.

Je pense que Model.AllTelephoneCellulaires retourne actuellement NULL où il devrait être une collection valide. Une solution consiste à initialiser ceci à une liste vide dans votre méthode d'action GET ou votre constructeur de classes de modèle de vue.

public partial class EmployeVM 
{ 
    // Your other properties goes here. 

    public IEnumerable<SelectListItem> AllTelephoneCellulaires { get; set; } 
    public EmployeVM() 
    { 
     AllTelephoneCellulaires = new List<SelectListItem>(); 
    } 
} 
+0

Merci, cela a fonctionné. Que le soleil brille tous les jours sur votre vie à Detroit, ou ailleurs ... :) –