对于我的存储库中的每个实体,我有一个视图模型和一个输入模型。我发现有一个输入模型来存储关系ID(与外来实体相对)使渲染选择列表更容易,但是哪个模型会传递到编辑视图进行渲染,查看模型或输入模型
Category
实体的示例POST操作:[HttpPost]
public ActionResult Edit(CategoryInputModel inputModel)
{
// map inputModel to entity and persist
// ...
}
[HttpGet]
public ActionResult Edit(int id)
{
var category = _unitOfWork.CurrentSession.Get<Category>(id);
var viewModel = Mapper.Map<Category, CategoryViewModel>(category);
return View(viewModel);
}
在这种情况下,编辑视图表单将负责为POST操作提供正确的输入模型字段。
[HttpGet]
public ActionResult Edit(int id)
{
var category = _unitOfWork.CurrentSession.Get<Category>(id);
var inputModel = Mapper.Map<Category, CategoryInputModel>(category);
return View(inputModel);
}
从长远来看哪个更容易维护?
答案 0 :(得分:3)
我现在使用的输入模型不包含ID。我将实体ID保留为动作参数,如下所示:
[HttpPost]
public ActionResult Edit(Guid id, CategoryInputModel inputModel)
{
var category = _categoryRepository.Get(id);
// do mappings from inputModel to category and save
// ...
}
答案 1 :(得分:2)
当详细/编辑屏幕完全相同时,我使用相同的ViewModel。
但是就像你已经注意到的那样,当屏幕不同时我会使用InputModel,我称之为FormModels。
我认为使用AutoMapper维护ViewModel非常便宜。使用.AssertConfigurationIsValid()(我忘记确切的方法名称)会立即告诉您域/商务对象与表单/视图模型之间的不同步。