我的MVC3网络应用程序中有一些模型,当用户创建或编辑对象/实体时,这些模型需要在“幕后”设置字段。
我正在试图找出关于这些类型字段的最佳做法。
例如......
public class EntityA {
public int Id { get; set; }
public string Title { get; set; }
...
[ForeignKey("User")]
public int UpdatedBy_Id { get; set; }
public virtual User UpdatedBy { get; set; }
}
为此创建和编辑视图允许用户编辑“标题”字段,但在插入或更新实体时,应用程序需要设置“UpdatedBy”字段。
最好是在视图上删除隐藏字段并在其中设置“UpdatedBy_Id”,还是使用模型属性“get / set”主体来执行此操作? ......或者......这应该在控制器中的HttpPost上吗?
答案 0 :(得分:1)
这是DTO(数据传输对象)派上用场的地方。
您的视图使用DTO作为模型。 DTO根据属性镜像您的实体对象,但不包括您不希望用户能够操作的属性。
然后,当您准备好持久保存Entity时,在控制器中创建一个新的Entity对象,并将DTO中的属性传递给该操作并将它们复制到您的Entity对象。此时您可以设置UpdatedBy属性。
为了使属性从实体映射到DTO(反之亦然),生活更轻松,如果对属性使用相同的名称,可以查看AutoMapper,它将自动处理此问题。
如果您只是将实体传递给视图,则用户可能会更改您不希望它们能够使用的属性值。
答案 1 :(得分:0)
我会说使用隐藏字段并设置UpdatedBy_Id。然后它将与表单一起回发,它可以像其他信息一样进行数据绑定。
答案 2 :(得分:0)
我更喜欢在用户控件之外放置这样的字段。特别是如果它们是整数字段,则用户可以编辑以制作虚假记录。然后选择使用TempData(如果启用了会话)或可能为当前用户动态检索它。如果您不担心用户修改它们,那么我会使用一个简单的隐藏字段或将其放在帖子的路由值中,从而允许框架为您完成工作。