正如我在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中。
有人知道如何在一个视图中实现视图模型和输入模型的分离吗?
答案 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将部门列表传递给部分。 或者使用接受视图模型作为其模型的部分视图