无法将项目加载到 Kendo().MultiSelect
Unable to load items into Kendo().MultiSelect
我正在开发一个 ASP.net MVC 应用程序与 EF 脚手架使用代码优先方法。使用 Kendo MultiSelect 的视图之一无法加载项目。在 运行 时,MultiSelect 仅显示文本 "undefined"。
这是模型
public class SessionStudent
{
public int SessionStudentID { get; set; }
public int SessionID { get; set; }
[Display(Name = "Session")]
public virtual Session Session { get; set; }
public IEnumerable<int> SelectedStudentIDs { get; set; }
public IEnumerable<Student> Student { get; set; }
public int GradeID { get; set; }
[Display(Name = "Grade")]
public virtual Grade Grade { get; set; }
}
这是控制器中的 Get 和 Post 方法
// GET: SessionStudents/Create
public ActionResult Create()
{
ViewBag.GradeID = new SelectList(db.Grades, "GradeID", "GradeName");
ViewBag.SessionID = new SelectList(db.Sessions, "SessionID", "SessionName");
ViewBag.StudentID = new SelectList(db.Students, "StudentID", "FName");
return View();
}
// POST: SessionStudents/Create
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "SessionStudentID,SessionID,GradeID")] SessionStudent sessionStudent)
{
if (ModelState.IsValid)
{
db.SessionStudents.Add(sessionStudent);
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.GradeID = new SelectList(db.Grades, "GradeID", "GradeName", sessionStudent.GradeID);
ViewBag.SessionID = new SelectList(db.Sessions, "SessionID", "SessionName", sessionStudent.SessionID);
return View(sessionStudent);
}
这是视图中的多选
<div class="form-group">
@Html.LabelFor(model => model.SessionStudentID, "StudentID", htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.Kendo().MultiSelectFor(model => model.SessionStudentID).BindTo((SelectList)ViewBag.StudentID).DataTextField("FName").DataValueField("StudentID").Name("SelectedStudentIDs")
@Html.ValidationMessageFor(model => model.SessionStudentID, "", new { @class = "text-danger" })
</div>
</div>
非常感谢这方面的任何帮助。
问题是对 SelectList 构造的误解。
当您使用
创建 SelectList 时
ViewBag.StudentID = new SelectList(db.Students, "StudentID", "FName");
"StudentID" 和 "FName" 是 db.Students 集合中的映射字段,不是 SelectList 中的访问器字段名称。
SelectList 仍将包含 "Text" 和 "Value" 字段映射自 "FName" 和 "StudentID" 的项目。
因此,当您将 MultiSelect 绑定到
@Html.Kendo().MultiSelectFor(model => model.SessionStudentID)
.BindTo((SelectList)ViewBag.StudentID)
.DataTextField("FName")
.DataValueField("StudentID")
.Name("SelectedStudentIDs")
您说的是“绑定到列表 ViewBag.StudentID,其中 "FName" 作为文本字段,"StudentID" 作为值字段。
BUT ViewBag.StudentID 是一个 SelectList,它根据定义使用 Text 和 Value。
删除 DataTextField 和 DataValueField 说明符应该会为您修复它,因为 MultiSelectFor 将使用默认值 "Text" 和 "Value"。
如果你 BindTo() 一个任意的 Enumerable 并且没有使用 Text 和 Value 作为访问器,你只需要使用 DataTextField 和 DataValueField,即如果你没有' t 将 db.Students 转换为 SelectList,使得 ViewBag.StudentID 是一个 IEnumerable, 然后 您需要告诉 MultiSelect 使用 FName 和 StudentID 来访问绑定可枚举。
我正在开发一个 ASP.net MVC 应用程序与 EF 脚手架使用代码优先方法。使用 Kendo MultiSelect 的视图之一无法加载项目。在 运行 时,MultiSelect 仅显示文本 "undefined"。
这是模型
public class SessionStudent
{
public int SessionStudentID { get; set; }
public int SessionID { get; set; }
[Display(Name = "Session")]
public virtual Session Session { get; set; }
public IEnumerable<int> SelectedStudentIDs { get; set; }
public IEnumerable<Student> Student { get; set; }
public int GradeID { get; set; }
[Display(Name = "Grade")]
public virtual Grade Grade { get; set; }
}
这是控制器中的 Get 和 Post 方法
// GET: SessionStudents/Create
public ActionResult Create()
{
ViewBag.GradeID = new SelectList(db.Grades, "GradeID", "GradeName");
ViewBag.SessionID = new SelectList(db.Sessions, "SessionID", "SessionName");
ViewBag.StudentID = new SelectList(db.Students, "StudentID", "FName");
return View();
}
// POST: SessionStudents/Create
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "SessionStudentID,SessionID,GradeID")] SessionStudent sessionStudent)
{
if (ModelState.IsValid)
{
db.SessionStudents.Add(sessionStudent);
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.GradeID = new SelectList(db.Grades, "GradeID", "GradeName", sessionStudent.GradeID);
ViewBag.SessionID = new SelectList(db.Sessions, "SessionID", "SessionName", sessionStudent.SessionID);
return View(sessionStudent);
}
这是视图中的多选
<div class="form-group">
@Html.LabelFor(model => model.SessionStudentID, "StudentID", htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.Kendo().MultiSelectFor(model => model.SessionStudentID).BindTo((SelectList)ViewBag.StudentID).DataTextField("FName").DataValueField("StudentID").Name("SelectedStudentIDs")
@Html.ValidationMessageFor(model => model.SessionStudentID, "", new { @class = "text-danger" })
</div>
</div>
非常感谢这方面的任何帮助。
问题是对 SelectList 构造的误解。
当您使用
创建 SelectList 时ViewBag.StudentID = new SelectList(db.Students, "StudentID", "FName");
"StudentID" 和 "FName" 是 db.Students 集合中的映射字段,不是 SelectList 中的访问器字段名称。 SelectList 仍将包含 "Text" 和 "Value" 字段映射自 "FName" 和 "StudentID" 的项目。
因此,当您将 MultiSelect 绑定到
@Html.Kendo().MultiSelectFor(model => model.SessionStudentID)
.BindTo((SelectList)ViewBag.StudentID)
.DataTextField("FName")
.DataValueField("StudentID")
.Name("SelectedStudentIDs")
您说的是“绑定到列表 ViewBag.StudentID,其中 "FName" 作为文本字段,"StudentID" 作为值字段。 BUT ViewBag.StudentID 是一个 SelectList,它根据定义使用 Text 和 Value。
删除 DataTextField 和 DataValueField 说明符应该会为您修复它,因为 MultiSelectFor 将使用默认值 "Text" 和 "Value"。
如果你 BindTo() 一个任意的 Enumerable 并且没有使用 Text 和 Value 作为访问器,你只需要使用 DataTextField 和 DataValueField,即如果你没有' t 将 db.Students 转换为 SelectList,使得 ViewBag.StudentID 是一个 IEnumerable, 然后 您需要告诉 MultiSelect 使用 FName 和 StudentID 来访问绑定可枚举。