如何在ASP.NET MVC 4中使用实体框架将所选值从下拉列表保存到数据库



在我的一个视图中,我添加了一个下拉列表,并将该下拉列表与我的数据库绑定,如下所示。。

public ActionResult PostMarks()
{
    JoinMod std = new JoinMod();
    std.Drp_bind = (from nm in db.TbStudent
                    select new SelectListItem
                    {
                        Text = nm.StudentName,
                        Value = SqlFunctions.StringConvert((double)nm.StudentId).Trim()
                    }).ToList<SelectListItem>();
    return View(std);
}

这是中的下拉列表

<p>StudentName</p>
    @Html.DropDownList("StudentName",Model.Drp_bind,"Select")

Post上,我正试图像这个一样将数据保存到数据库中

 [HttpPost]
 public ActionResult PostMarks(Marks marks)
 {
    db.TbMarks.Add(marks);
    db.SaveChanges();
    return RedirectToAction("ShowAllMarks");
 }

现在,当我在数据库中保存数据后检查我的数据库时,保存在数据库中的Id从dropdownlist为零。请专家帮助我解决这个问题

您应该使用@HTML.DropDownListFor,指定一个lambda,该lambda指示您希望在POST上将列表的选定值绑定到模型中的哪个属性。

给定这样的视图模型:

public class MarksViewModel 
{
    public Marks Marks { get; set; }
    public IEnumerable<SelectListItem> Drp_bind { get; set; }
}

CSHTML中的下拉列表可以这样声明:

@Html.DropDownListFor(m => m.Marks.StudentId, m.Drp_bind, "Select a Student")

第一个参数是描述模型上的属性的表达式,您希望用post-back中下拉列表中的选定值填充该属性。第二个是包含我们需要数据绑定的值的列表。

请注意,CSHTML中需要更多绑定到Marks属性的其他属性的表单字段。

POST方法现在将MarksViewModel作为参数,并从中提取Marks属性以添加到DbContext中进行保存。

最新更新