【问题标题】:Unable to load items into Kendo().MultiSelect无法将项目加载到 Kendo().MultiSelect
【发布时间】:2017-03-13 12:03:25
【问题描述】:

我正在使用代码优先方法开发一个带有 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>

非常感谢您在这方面的任何帮助。

【问题讨论】:

    标签: asp.net-mvc kendo-ui kendo-multiselect


    【解决方案1】:

    问题是对 SelectList 构造的误解。

    当你创建一个 SelectList 时

    ViewBag.StudentID = new SelectList(db.Students, "StudentID", "FName");
    

    “StudentID”和“FName”是 db.Students 集合中的映射字段,不是 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”作为值字段。 但是 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 来访问绑定的枚举中的项目。

    【讨论】:

    • 这解决了我的问题。但是,公共 IEnumerable SelectedStudentIDs { get;放; } 属性取空值。我希望它能够存储选定的学生 ID。
    猜你喜欢
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    相关资源
    最近更新 更多