ListBoxFor 'List' 错误需要 'SelectedListItem'
ListBoxFor 'List' error needing to be a 'SelectedListItem'
按照 https://www.codeproject.com/Articles/702890/MVC-Entity-Framework-and-Many-to-Many-Relation 示例,我在发布 Edit.cshtml 时遇到下一个错误:
"The ViewData item that has the key 'SelectedTelephoneCellulaires' is of type 'System.Collections.Generic.List' but must be of type 'IEnumerable'."
我在网上搜索(当然!),但最接近的两个问题答案(Issues converting types to new selectitemlist && )并没有给我的困难带来任何解决方案。
这是我的 ViewModel 的一部分(节食,为了便于阅读):
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; }
}
}
}
我的 EmploysController 的一部分(节食):
[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);
}
最后,我的 Edit.cshtml(你猜对了 - 在节食......)
<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>
两个先前的答案都解决了 "Model.AllTelephoneCellulaires" 会导致错误的事实,而不是 "m.SelectedTelephoneCellulaires"
最有趣的是,不久前我能够毫无问题地编辑一名员工,但是当我试图编辑另一名员工时(两者都没有触及 'TelephoneCellulaire' 输入),砰!错误来了。
我只是不明白为什么会出现此错误?为什么我的 SelectedThing 需要是 "SelectListItem" 类型?我该如何解决???如果有人能帮助我,我将永远感激你。现在,我躲在桌子底下哭泣,像胎儿一样吮吸着拇指...
根据您提供的代码,我非常肯定您会收到此错误,因为您没有将有效的 SelectListItem 集合传递给 ListBoxFor
辅助方法。
我认为 Model.AllTelephoneCellulaires
当前正在返回 NULL
,它应该是一个有效的集合。一种解决方案是在 GET 操作方法或视图模型 类 构造函数中将其初始化为一个空列表。
public partial class EmployeVM
{
// Your other properties goes here.
public IEnumerable<SelectListItem> AllTelephoneCellulaires { get; set; }
public EmployeVM()
{
AllTelephoneCellulaires = new List<SelectListItem>();
}
}
按照 https://www.codeproject.com/Articles/702890/MVC-Entity-Framework-and-Many-to-Many-Relation 示例,我在发布 Edit.cshtml 时遇到下一个错误:
"The ViewData item that has the key 'SelectedTelephoneCellulaires' is of type 'System.Collections.Generic.List' but must be of type 'IEnumerable'."
我在网上搜索(当然!),但最接近的两个问题答案(Issues converting types to new selectitemlist &&
这是我的 ViewModel 的一部分(节食,为了便于阅读):
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; }
}
}
}
我的 EmploysController 的一部分(节食):
[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);
}
最后,我的 Edit.cshtml(你猜对了 - 在节食......)
<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>
两个先前的答案都解决了 "Model.AllTelephoneCellulaires" 会导致错误的事实,而不是 "m.SelectedTelephoneCellulaires"
最有趣的是,不久前我能够毫无问题地编辑一名员工,但是当我试图编辑另一名员工时(两者都没有触及 'TelephoneCellulaire' 输入),砰!错误来了。
我只是不明白为什么会出现此错误?为什么我的 SelectedThing 需要是 "SelectListItem" 类型?我该如何解决???如果有人能帮助我,我将永远感激你。现在,我躲在桌子底下哭泣,像胎儿一样吮吸着拇指...
根据您提供的代码,我非常肯定您会收到此错误,因为您没有将有效的 SelectListItem 集合传递给 ListBoxFor
辅助方法。
我认为 Model.AllTelephoneCellulaires
当前正在返回 NULL
,它应该是一个有效的集合。一种解决方案是在 GET 操作方法或视图模型 类 构造函数中将其初始化为一个空列表。
public partial class EmployeVM
{
// Your other properties goes here.
public IEnumerable<SelectListItem> AllTelephoneCellulaires { get; set; }
public EmployeVM()
{
AllTelephoneCellulaires = new List<SelectListItem>();
}
}