Tro*_*ing 4 asp.net-mvc entity-framework viewmodel razor dropdownlistfor
对于我可以使用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; }
}
Run Code Online (Sandbox Code Playgroud)
查看模型
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);
}
}
Run Code Online (Sandbox Code Playgroud)
我的上下文课程
public class EmployeeContext : DbContext
{
public DbSet<Employee> Employees { get; set; }
public DbSet<Department> Departments { get; set; }
public DbSet<Grade> Grades { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的控制器
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);
}
}
Run Code Online (Sandbox Code Playgroud)
我的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" />
}
Run Code Online (Sandbox Code Playgroud)
小智 7
主要的问题是,在视图中,您有new 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; }
}
Run Code Online (Sandbox Code Playgroud)
并根据需要添加显示和验证属性.请注意,我删除了构造函数(您似乎没有使用它,但是如果您这样做了,那么您还需要包含一个无参数构造函数,否则在提交POST方法时会抛出异常.我还假设这Level应该TYPEOF int因为您有约束力的int ID财产Grade.
你的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);
Run Code Online (Sandbox Code Playgroud)
并在视图中
@Html.DropDownListFor(x => Model.Level, Model.Grades, "Select Level")
Run Code Online (Sandbox Code Playgroud)
另请注意,在POST方法中,SelectList如果返回视图,ModelState则需要重新分配,因为它无效.