【问题标题】:Retrieve data from ViewModel从 ViewModel 检索数据
【发布时间】: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&lt;DataEntryMVC.Models.EmployeeViewModel&gt;

@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


    【解决方案1】:

    错误是不言自明的。您的视图被强类型化为EmployeeViewModel 类(IEnumerable&lt;EmployeeViewModel&gt;) 的集合,但在您的操作方法中,您返回的是Employee 实体列表。

    解决方法是将实体列表转换为视图模型列表并将其返回给视图。您可以使用 LINQ Select 方法来做到这一点。

    public IActionResult Index()
    {
        var list=_context.Employees
                         .Select(s=> new EmployeeViewModel { 
                                                             EmpId =s.EmpId ,
                                                             EmpFirstName=s.EmpFirstName,
                                                             EmpLastName=s.EmpLastName,
                                                             EmpPhoneNumber=s.EmpPhoneNumber,
                                                             EmpStartDate=s.EmpStartDate,
                                                             DeptName=s.Department.DeptName
                                                           }).ToList();
        return View(list);
    }
    

    【讨论】:

    • 谢谢 Shyju,我只需要添加 DeptName = s.Department.DeptName 即可检索 DeptName 值。您能否向我解释一下与我尝试做的事情和您的示例的区别,以便我理解?我还在学习中,所以请放轻松给我解释:)
    • 再读一遍答案的第一段。 razor 视图是您的视图模型集合的强类型,但您的代码正在发送 Employee 类的列表。就像您正在为装有柴油发动机的汽车加油一样。它不会很好地工作。
    • 所以我拥有/拥有的视图是强类型的,但我尝试检索数据的原始方式不是,这就是为什么我得到错误的原因?这是您从 ViewModel 中检索数据的方式,而不是像我尝试的那样使用 return View(_context.Employee.ToList()); 吗?
    • 是的。你做的方式(使用视图模型)很棒!
    • 我的印象是,只要在索引方法上使用这个return View(_context.Employees.ToList());,我就可以从 ViewModel 中检索数据。不要误会我的意思,我也喜欢你的方法,但我认为我可以用另一种方式检索它。您使用的方式是什么,是否有名称来说明您从 ViewModel 获取数据的操作。只是想知道,这样我就可以研究这个过程来学习。
    猜你喜欢
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 2014-12-12
    • 2013-12-17
    相关资源
    最近更新 更多