asp.net-mvc - ASP NET MVC 中的模型绑定(bind)数据库实体

标签 asp.net-mvc nhibernate model-view-controller modelbinders

我无法思考在 Controller 操作中重新创建数据库对象的最佳方法是什么。

我想利用 ModelBinders,因此在我的操作中我可以通过参数访问该对象,而不必重复代码以根据标识符参数从数据库获取对象。因此,我正在考虑使用一个 ModelBinder,它执行对数据访问层的调用以获取原始对象(如果数据库中不存在,则创建一个新对象),然后将任何属性绑定(bind)到数据库对象以更新它。但是我读到 ModelBinder 不应该进行数据库查询(此评论的第一条 article )。

如果 ModelBinder 不应执行数据库查询(因此只需使用 DefaultModelBinder),那么具有其他数据库对象属性的数据库对象又如何呢?这些永远不会被分配。

在用户编辑对象后保存该对象(在 View 中可编辑 1 或 2 个属性),ModelBinded 对象将丢失数据,因此按原样保存它会导致数据库中的数据被无效值覆盖,或 NOT-NULL 约束失败。

那么,从与从 View 发回的表单数据绑定(bind)的数据库中获取 Controller 操作中的对象的最佳方法是什么?

注意我使用 NHibernate。

最佳答案

我从数据库获取模型对象,然后在该对象上使用 UpdateModel(或 TryUpdateModel)来更新表单参数中的值。

public ActionResult Update( int id )
{
     DataContext dc = new DataContext();
     MyModel model = dc.MyModels.Where( m => m.ID == id ).SingleOrDefault();

     string[] whitelist = new string[] { "Name", "Property1", "Property2" };

     if (!TryUpdateModel( model, whitelist )) {
        ... model error handling...
        return View("Edit");
     }

     ViewData.Model = model;

     return View("Show");
}

关于asp.net-mvc - ASP NET MVC 中的模型绑定(bind)数据库实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/514023/

相关文章:

c# - 为另一个 Controller 类调用 Controller 类 public Void 方法

c# - 使用流利的 NHibernate 映射一个只读的 sql View

nhibernate - 使用 LINQ to NHibernate 按日期分组

javascript - 如何正确分离 JavaScript View /逻辑代码

spring - 在 Freemarker 模板中显示 Spring MVC 验证错误

c# - 根据另一个下拉列表中的选择填充下拉列表

asp.net - Umbraco 中的波斯语日期选择器(asp.net 的 cms)

c# - 是否可以在 Azure 上运行 .Net UWP 类库?

c# - 将 nhibernate 与 Unity3D 集成

ios - 应该将以编程方式构建 View 的代码放在 UIView 还是 UIViewController 中?