我现在这样做的方式(有效)感觉有点黑客。在编辑实体时,我不希望用户更改后面的关键审计字段,例如,最初创建实体时,它会自动填充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;
有没有更好的方法来解决这个问题,下面的方法有效但效果不高。
答案 0 :(得分:0)
建议的方法是使用仅包含显示/编辑所需的proeprties的视图模型说
public class AccountVM
{
public int ID { get; set; }
public string Name { get; set; }
}
然后在视图中使用并回发到控制器,根据ID
属性获取数据模型,并将视图模型属性映射到数据模型并保存。请注意,[Bind]
属性不是必需的。
使用视图模型具有许多优点,包括应用视图特定属性和防止叠加攻击。有关更多信息,请参阅What is ViewModel in MVC?
的答案automapper等工具可以更轻松地在数据和视图模型之间进行映射。