我正在使用代码优先方法使用EF Scaffolding开发ASP.net MVC应用程序。使用Kendo MultiSelect的视图之一无法加载项目。在运行时,MultiSelect仅显示文本“未定义”。
这是模型
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; }
}
这是Controller中的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);
}
这是视图中的MultiSelect
<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>
对此方面的任何帮助表示高度赞赏。
答案 0 :(得分:0)
问题是对SelectList结构的误解。
使用
创建SelectList时ViewBag.StudentID = new SelectList(db.Students, "StudentID", "FName");
“StudentID”和“FName”是db.Students集合中的映射字段, NOT 是SelectList中的访问者字段名称。 SelectList仍将包含从“FName”和“StudentID”映射的“Text”和“Value”字段的项目。
因此,当您将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,即如果你没有转换db.Students到一个SelectList,使得ViewBag.StudentID是一个IEnumerable,然后你需要告诉MultiSelect使用FName和StudentID来访问绑定枚举中的项目。