加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 使用Entity Framework 6和ViewModel从数据库表填

发布时间:2020-12-16 07:20:42 所属栏目:asp.Net 来源:网络整理
导读:对于我可以使用ajax / jquery和存储过程快速完成的问题,我一直在摸不着头脑.我想要 1)使用Entity Framework和视图模型从数据库表中获取的值填充下拉列表.我不想使用VIEWBAG或VIEWDATA.任何帮助赞赏. 2)如何使用具有所有默认字段的视图模型生成创建视图?脚手
对于我可以使用ajax / jquery和存储过程快速完成的问题,我一直在摸不着头脑.我想要

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

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

我的模特

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);
    }
}

我的上下文课程

public class EmployeeContext : DbContext
{
    public DbSet<Employee> Employees { get; set; }
    public DbSet<Department> Departments { get; set; }
    public DbSet<Grade> Grades { get; set; }
}

我的控制器

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 PAGE 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" />
}

解决方法

主要问题是在视图中你有新的SelectList(Model.Grades,“ID”,“Level”),但是Grades是IEnumerable< SelectListItem>和SelectListItem不包含名为ID和Level的属性.

但是,您的代码还存在一些其他问题.首先,视图模型不应包含数据模型,而应该是视图模型

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方法时会抛出异常.我还假设因为你绑定到Grade的int ID属性,所以Level应该是typeof int.

你的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);

并在视图中

@Html.DropDownListFor(x => Model.Level,Model.Grades,"Select Level")

另请注意,在POST方法中,如果返回视图,则需要重新分配SelectList,因为ModelState无效.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读