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 ...
Merci, cela a fonctionné. Que le soleil brille tous les jours sur votre vie à Detroit, ou ailleurs ... :) –