【问题标题】:ViewModel vs. InputModel in Razor ViewRazor 视图中的 ViewModel 与 InputModel
【发布时间】:2014-12-22 17:08:09
【问题描述】:

正如我在10 Good practices for asp.net mvc webapplications 上发现的,在 ViewModel(代表视图的模型)和 InputModels(代表用户输入的数据)中拆分 mvc 模型是一种很好的做法。

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

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

【问题讨论】:

  • 尽管我同意本文的大部分内容,但我看不出从视图模型中分离“输入模型”的巨大好处。视图模型被认为是用户正在编辑的数据的“视图”,因此不需要单独的输入模型,在您的情况下,它也会使事情变得过于复杂

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


【解决方案1】:

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

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 的示例。

【讨论】:

  • 这意味着我必须将所有部门与输入模型绑定。从我的角度来看,这是错误的。输入模型应该只绑定所选部门的 id。
  • 哦,也许我当时误解了这个问题。您只想将选定的部门放在视图模型中并在用户不编辑的情况下将其取回?
  • 选择部门的Id是根据下拉列表中选择的部门通过modelbinding设置的。可选择的部门应该只在视图模型中可用,而不是在输入中。
【解决方案2】:

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

【讨论】:

  • ViewBag 是没有选择的,因为它不是重构安全的,您几乎可以在任何应该避免使用 ViewBag 的地方阅读它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-21
  • 1970-01-01
  • 2011-07-05
相关资源
最近更新 更多