Razor视图中的ViewModel与InputModel

本文关键字:InputModel ViewModel 视图 Razor | 更新日期: 2023-09-27 18:27:55

正如我在asp.net mvc web应用程序的10个良好实践中发现的那样,将mvc模型拆分为ViewModel(表示视图的模型)和InputModels(表示用户输入的数据)是一个很好的实践。

ViewModel获取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;}
}

控制器方法看起来像:

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中。

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

Razor视图中的ViewModel与InputModel

您必须创建部门的模型抽象。类似这样的东西:

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

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

你可以看看这个SO问题作为一个例子。

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