asp.net-mvc - 使用 Entity Framework 6 和 ViewModel 从数据库表中填充 ASP.NET MVC 中的 DropDownList

标签 asp.net-mvc entity-framework razor viewmodel dropdownlistfor

对于一个我可以使用 ajax/jquery 和存储过程快速完成的问题,我整晚都在摸不着头脑。我想要

1) 从使用 Entity Framework 和 View 模型的数据库表中获得的值填充下拉列表。我不想使用 VIEWBAG 或 VIEWDATA。任何帮助表示赞赏。

2)如何使用具有所有默认字段的 View 模型生成创建 View ?脚手架适用于模型但不适用于 View 模型?

我的模特

public class Employee
{
    public int EmployeeID { get; set; }
    public string Name { get; set; }
    public string Gender { get; set; }
    public string City { get; set; }
    public string Level { get; set; }
    public int DepartmentId { get; set; }
}

public class Grade
{
    public int ID { get; set; }
    public string Level { get; set; }
}

查看型号
public class GradeSelectListViewModel
{

    public Employee Employee { get; set; }
    public IEnumerable<SelectListItem> Grades { get; set; }
    public GradeSelectListViewModel(Employee employee, IEnumerable grades)
    {
        Employee = employee;
        Grades = new SelectList(grades, "Grade", "Name", employee.Level);
    }
}

我的上下文类(class)
public class EmployeeContext : DbContext
{
    public DbSet<Employee> Employees { get; set; }
    public DbSet<Department> Departments { get; set; }
    public DbSet<Grade> Grades { get; set; }
}

我的 Controller
public ActionResult Edit (int? id)
{
    using (var db = new EmployeeContext())
    {
        var model = new GradeSelectListViewModel(db.Employees.Find(id), db.Grades);
        //model.Employee = db.Employees.Single(x => x.EmployeeID == id);
        model.Grades = db.Grades.ToList().Select(x => new SelectListItem
        {
            Value = x.ID.ToString(),
            Text = x.Level
        });
        return View(model);
    }
}

我的 Razor 页面 CSHTML
@model MVCDemo.ViewModels.GradeSelectListViewModel
....
@using (Html.BeginForm()) 
{
    @Html.AntiForgeryToken()
    ....
    @Html.DropDownListFor(x => Model.Employee.Level,
        new SelectList(Model.Grades, "ID", "Level"),
        "Select Level")
    ....
    <input type="submit" value="Create" class="btn btn-default" />
}

最佳答案

主要问题是在 View 中你有 new SelectList(Model.Grades, "ID", "Level")但是 GradesIEnumerable<SelectListItem>SelectListItem不包含名为 ID 的属性和 Level .

但是,您的代码还有一些其他问题。首先, View 模型不应该包含数据模型,而您的 View 模型应该是

public class GradeSelectListViewModel
{
    public int? ID { get; set; } // make this ID so you do not need an input for it
    public string Name { get; set; }
    .... // other properties of Employee that your editing
    [Required(ErrorMessage = "..")]
    public int? Level { get; set; } // make value types nullable to protect against under-posting attacks
    public IEnumerable<SelectListItem> Grades { get; set; }
}

并根据需要添加显示和验证属性。注意我删除了构造函数(你好像没有使用,但是如果使用了,那么你还需要包含一个无参数的构造函数,否则提交POST方法时会抛出异常。我也假设Level 应该是 int 的类型,因为您绑定(bind)到 int IDGrade 属性。

GET 方法中的代码应该是
Employee employee = db.Employees.Find(id);
var model = new GradeSelectListViewModel()
{
    ID = employee.EmployeeID,
    Name = employee.Name,
    Level = employee.Level, // convert to int?
    ....
    Grades = db.Grades.Select(x => new SelectListItem
    {
        Value = x.ID.ToString(),
        Text = x.Level
    })
};
return View(model);

并且在 View 中
 @Html.DropDownListFor(x => Model.Level, Model.Grades, "Select Level")

另请注意,在 POST 方法中,您需要重新分配 SelectList如果您返回 View 是因为 ModelState是无效的。

关于asp.net-mvc - 使用 Entity Framework 6 和 ViewModel 从数据库表中填充 ASP.NET MVC 中的 DropDownList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42549622/

相关文章:

c# - 将 HTML 放入 Html.ActionLink() 中,加上没有链接文本?

javascript - Angularjs/ASP.NET : How can I read a json returned from my controller and set it to a variable?

asp.net-mvc - 我可以从操作过滤器返回操作结果吗?

c# - Entity Framework 更新不工作

javascript - 隐藏 KendoUI 下拉列表

c# - 在 MVC 的每个页面上放置重复出现的代码的正确位置是什么

asp.net-mvc - 如何管理不同 Controller 中的 MVC 区域和 RenderAction?

asp.net-mvc - Xml序列化无法写入 'x'类型的对象

c# - linq 到实体 : linq query performance optimization

asp.net-mvc - 如何创建具有多个模型 mvc 4 的 View ?