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中。
有人知道如何在一个视图中实现视图模型和输入模型的分离吗?
您必须创建部门的模型抽象。类似这样的东西:
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将部门列表传递给您的分部。或者使用接受视图模型作为其模型的部分视图