Razor View中的ViewModel与InputModel

时间:2014-10-27 13:44:34

标签: c# asp.net asp.net-mvc razor viewmodel

正如我在10 Good practices for asp.net mvc webapplications上发现的那样,在ViewModel(表示视图的模型)和InputModels(表示用户输入的数据)中拆分mvc模型是一个好习惯。

ViewModel获取Type InputModel的属性。 InputModel携带可由用户编辑的数据。

public class EmployeeInputModel{

     public string Name {get;set;}
     public Id? DepartmentId{get;set;}

}


public class EmployeeCreateViewModel{
      public IList<Department> Departments{get;set;}
      public EmployeeInputModel EmployeeModel{ get;set;}
}

Controller-methods看起来像:

public class EmployeeController : Controller{

     public ActionResult Create(){
          var viewModel = new EmployeeCreateViewModel(DepartmentService.GetAll(), new EmployeeInputModel());
          return View(viewModel);
     }

     public ActionResult Create(EmployeeInputModel createModel){
          try{
               EmployeeService.Create(...);
               return RedirectToAction("Index");
          } catch (Exception ex){
               var viewModel = new EmployeeCreateViewModel(DepartmentService.GetAll(), createModel);
               return View(viewModel)
          }

     }
}

视图如下:

  @model EmployeeCreateViewModel

  @Html.EditorFor(m => m.EmployeeModel)

编辑部分就像:

  @model EmployeeInputModel

  @Html.TextBoxFor(m => m.Name)
  @Html.DropDownFor(m => m.Department, ???)

这对我来说很有用,除非我达到了DropDownLists(在示例中看到部门)。因为EditorTemplate不知道ViewModel而只知道InputModel。

我不想将部门列表放入输入模型,因为它不是这个列表的假定位置(我必须绑定它们)。它必须在viewmodel中。输入模型的属性也不应该在ViewModel中。

有人知道如何在一个视图中实现视图模型和输入模型的分离吗?

2 个答案:

答案 0 :(得分:0)

您必须创建部门的模型抽象。像这样:

public class EmployeeInputModel{
     public string Name {get;set;}
     public List<DepartmentInputModel> Departments{get;set;}
}

public class DepartmentInputModel{
  public int Id;
  public string Name;
}

然后,您可以在下拉列表中仅显示部门的名称。然后该值将是部门的ID。

您可以查看this SO question作为示例。

答案 1 :(得分:0)

您可以使用ViewBag将部门列表传递给部分。 或者使用接受视图模型作为其模型的部分视图