【发布时间】:2016-07-23 04:16:56
【问题描述】:
我现在有 2 个模型和 1 个视图模型。它们在下面列出。我想在索引方法上显示我的员工模型中的所有字段以及我的部门模型中的 2 个字段。因此,我创建了包含所有字段的 ViewModel,并添加了一个 public IEnumerable<SelectListItem> DeptList { get; set; },用于在我的 Create Method 上将数据检索到 DropDownList(效果很好)。
员工模型:
public class Employee
{
[Key]
public int EmpId { get; set; }
[Column(TypeName = "varchar(50)")]
[MaxLength(50)]
[Required(ErrorMessage = "First Name is Required")]
public string EmpFirstName { get; set; }
[Column(TypeName = "varchar(50)")]
[MaxLength(50)]
[Required(ErrorMessage = "Last Name is required")]
public string EmpLastName { get; set; }
[Column(TypeName = "varchar(10)")]
[DataType(DataType.PhoneNumber)]
[MaxLength(10)]
[Required(ErrorMessage = "Phone Number is required")]
public string EmpPhoneNumber { get; set; }
[Column(TypeName = "datetime2(7)")]
[DataType(DataType.Date)]
[Required(ErrorMessage = "Start Date is required")]
[DisplayFormat(DataFormatString = "{0:D}")]
public DateTime EmpStartDate { get; set; }
public int DeptId { get; set; }
public Department Department { get; set; }
}
部门模型:
public class Department
{
[Key]
public int DeptId { get; set; }
[Required(ErrorMessage = "Department Name is required")]
[Column(TypeName = "varchar(50)")]
[MaxLength(50)]
public string DeptName { get; set; }
public List<Employee> Employees { get; set; }
}
EmployeeViewModel:
如果可能,我想为我的 CRUD 创建一个 ViewModel。
public class EmployeeViewModel
{
public int EmpId { get; set; }
public string EmpFirstName { get; set; }
public string EmpLastName { get; set; }
public string EmpPhoneNumber { get; set; }
public DateTime EmpStartDate { get; set; }
public int DeptId { get; set; }
public string DeptName { get; set; }
public IEnumerable<SelectListItem> DeptList { get; set; }
}
员工控制人:
public class EmployeeController : Controller
{
private DataEntryContext _context;
public EmployeeController(DataEntryContext context)
{
_context = context;
}
// GET: /<controller>/
public IActionResult Index()
{
return View(_context.Employees.ToList());
}
// Retrieve List of Departments
private IEnumerable<SelectListItem> GetDeptList()
{
var dept = _context.Departments
.Select(s => new SelectListItem
{
Value = s.DeptId.ToString(),
Text = s.DeptName
})
.ToList();
return (dept);
}
public IActionResult Create()
{
EmployeeViewModel selectList = new EmployeeViewModel();
selectList.DeptList = GetDeptList();
return View(selectList);
}
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Create(EmployeeViewModel employee)
{
if (ModelState.IsValid)
{
var emp = new Employee();
{
emp.EmpFirstName = employee.EmpFirstName;
emp.EmpLastName = employee.EmpLastName;
emp.EmpPhoneNumber = employee.EmpPhoneNumber;
emp.EmpStartDate = employee.EmpStartDate;
emp.DeptId = employee.DeptId;
}
_context.Employees.Add(emp);
_context.SaveChanges();
return RedirectToAction("Index");
}
return View(employee);
}
}
查看索引方法:
我在这个视图的顶部添加了@model IEnumerable<DataEntryMVC.Models.EmployeeViewModel>。
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.EmpFirstName)
</td>
<td>
@Html.DisplayFor(modelItem => item.EmpLastName)
</td>
<td>
@Html.DisplayFor(modelItem => item.EmpPhoneNumber)
</td>
<td>
@Html.DisplayFor(modelItem => item.EmpStartDate)
</td>
<td>
@Html.DisplayFor(modelItem => item.DeptName)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id = item.EmpId })
</td>
</tr>
}
检索数据时收到的错误消息:
处理请求时发生未处理的异常。
InvalidOperationException:传递到 ViewDataDictionary 的模型项的类型为 System.Collections.Generic.List`1[DataEntryMVC.Models.Employee],但此 ViewDataDictionary 实例需要“System.Collections.Generic.IEnumerable”类型的模型项`1[DataEntryMVC.Models.EmployeeViewModel]'。
另外,我是否正确处理了将数据添加到数据库的 Create 方法?
【问题讨论】:
标签: c# asp.net-mvc entity-framework