有关如何使用View模型与MVC和ModelBinding的一些清晰度请

时间:2013-06-05 10:53:56

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 entity-framework-4

我对在编辑表单中使用ViewModels感到困惑,其中一个属性是可编辑实体,即

ViewModel
   Entity
   Actions

View页面顶部的模型声明:

   @model MyProject.Models.ViewModel

   @model MyProject.Models.Entity

那么表示实体属性的最佳方式是什么,这是需要更新的实体属性。我首先开始制作一个变量。

Entity myEntity = ViewModel.Entity;

因此,每个表单元素编辑字段可以表示为:

@Html.EditorFor(model => myEntity.Name)

但是,后期操作中的模型绑定参数会发生什么?

    [HttpPost]
    public ActionResult Edit(Entity myEntity)

            db.Entities.Attach(myEntity);
            db.ObjectStateManager.ChangeObjectState(myEntity, EntityState.Modified);
            db.SaveChanges();

所以这个问题实际上是关于如何处理ViewModel中的可编辑属性对象,而不是特定的实体对象,可以作为直接模型传入。

回答很可能很简单。

提前非常感谢。

编辑:

有关如何从View中的ViewModel引用域对象的反馈。我发现如果我直接在lambda expresions中引用它们,那么模型绑定工作正常,因为它可以使用派生的id来导航返回的ViewModel。如果在View中使用局部变量,则在Id中使用此变量名称,然后断开ViewModel模型绑定映射。

1 个答案:

答案 0 :(得分:2)

您的POST操作应将视图模型作为参数,而不是域模型:

[HttpPost]
public ActionResult Edit(ViewModel viewModel)

然后您应该使用此viewModel的ID从需要更新的数据库中检索相应的域模型。然后从视图模型更新此域模型的属性。最后将域模型保留回数据库。