在构建视图模型时遵循正确的练习

时间:2015-10-06 14:48:25

标签: c# asp.net-mvc asp.net-mvc-4

关于我对ASP.NET MVC和viewmodels的处理方法,我遇到了一个警告。基本上我所做的是在控制器/动作中构建一个viewmodel,它将模型合并在一起,然后将它传递给视图。

    [HttpGet]
    public ActionResult MyAction1()
    {
     List<StaffModel> staffList = new List<StaffModel>();
     var qryStaff = context.Staff.Select(c => new { c.ID, c.name});
      foreach (var item in qryStaff )
        {
            StaffModel myStaffViewModel = new StaffModel
            {   
                ID = item.ID, Name = item.Name
            };
            staffList.Add(myStaffViewModel );
        }

所以我做了上面的过程,也和员工一起做了,完全一样,然后把它放到employeeList中。然后我创建我的viewModel作为视图。

           EmployeeStaffViewModel viewModel = new EmployeeStaffViewModel 
        {                
            Staff = staffList,
            Employee = employeeList
        };

然后我返回视图。我使用过员工&amp;以员工为例。我实际上有更多的模型我添加到viewModel EmployeeStaffViewModel。它在控制器动作中变得非常大。我应该将ViewModel创建为一个类,然后在我的控制器中实例化它,以便所有linq和foreach都在模型中。因此我可以在另一个控制器动作中使用它。

感谢您的任何建议。将受到极大的欢迎。

1 个答案:

答案 0 :(得分:1)

假设您的~/Models文件夹中有3个班级

<强> StaffModel.cs

public class StaffModel
{
    public int ID { get; set; }
    public string Name { get; set; }
    public static Func<Staff, StaffModel> Project = item => new StaffModel
    { 
        ID = item.ID,
        Name = item.Name
    };
}

<强> EmployeeModel.cs

public class EmployeeModel
{
    public int ID { get; set; }
    public string Name { get; set; }
    public static Func<Employee, EmployeeModel> Project = item => new EmployeeModel
    {
        ID = item.ID,
        Name = item.Name
    };
}

<强> EmployeeStaffViewModel.cs

public class EmployeeStaffViewModel
{
    public EmployeeStaffViewModel()
    {
        Staff = new List<StaffModel>();
        Employee = new List<EmployeeModel>();
    }
    public List<StaffModel> Staff { get; set; }
    public List<EmployeeModel> Employee { get; set; }
}

StaffModel和EmployeeModel都有静态Func&lt;&gt;这会将您的数据库实体映射到您的模型。这些Func可以在您的linq查询和表达式中使用,您将在下面看到。

您可以在控制器操作中从上下文中检索实体。您可以简化代码,使其没有像您那样多的行。

<强> MyController.cs

[HttpGet]
public ActionResult MyAction1()
{
    var model = new EmployeeStaffViewModel();
    model.Staff = context.Staff.Select(StaffModel.Project);  //Select Staff to StaffModel List
    model.Employee = context.Employee.Select(EmployeeModel.Project); //Select Employee to EmployeeModel List
    return View(model);
}