如何从Entity Framework中检索Controller中的现有上下文值?

时间:2015-08-17 22:31:15

标签: c# asp.net-mvc entity-framework

我现在这样做的方式(有效)感觉有点黑客。在编辑实体时,我不希望用户更改后面的关键审计字段,例如,最初创建实体时,它会自动填充DateAdded,AddedBy,EditedBy。

要阻止人们编辑这些值,我不会在编辑时将它们绑定在包含中:

public ActionResult Edit([Bind(Include = "Id,AccountName")] Account account)

这意味着我必须这样做才能获得原始值,否则它们将被设置为null

account.DateAdded = db.Accounts.Where(c => c.Id == account.Id).Select(d => d.DateAdded).FirstOrDefault();
account.AddedBy = db.Accounts.Where(c => c.Id == account.Id).Select(a => a.AddedBy).FirstOrDefault();
account.EditedBy = User.Identity.Name;

有没有更好的方法来解决这个问题,下面的方法有效但效果不高。

1 个答案:

答案 0 :(得分:0)

建议的方法是使用仅包含显示/编辑所需的proeprties的视图模型说

public class AccountVM
{
  public int ID { get; set; }
  public string Name { get; set; }
}

然后在视图中使用并回发到控制器,根据ID属性获取数据模型,并将视图模型属性映射到数据模型并保存。请注意,[Bind]属性不是必需的。

使用视图模型具有许多优点,包括应用视图特定属性和防止叠加攻击。有关更多信息,请参阅What is ViewModel in MVC?

的答案

automapper等工具可以更轻松地在数据和视图模型之间进行映射。