Asp.net mvc 3 MVC3、模型、创建和维护;编辑隐藏字段

Asp.net mvc 3 MVC3、模型、创建和维护;编辑隐藏字段,asp.net-mvc-3,models,edit,hidden,Asp.net Mvc 3,Models,Edit,Hidden,我的MVC3 web应用程序中有一些模型,当用户创建或编辑对象/实体时,需要在“幕后”设置字段 我正试图找出关于这些领域的最佳实践 例如 public class EntityA { public int Id { get; set; } public string Title { get; set; } ... [ForeignKey("User")] public int UpdatedBy_Id { get; set; } public virtual User U

我的MVC3 web应用程序中有一些模型,当用户创建或编辑对象/实体时,需要在“幕后”设置字段

我正试图找出关于这些领域的最佳实践

例如

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”body来执行此操作。。。或这应该在控制器的HttpPost上吗?

我会说使用一个隐藏字段并设置UpdatedBy_Id。然后它将与表单一起发布,并且可以像其他信息一样进行数据绑定。

我更喜欢将这样的字段置于用户控制之外。尤其是当它们是整数字段时,用户可以编辑它们来制作虚假记录。然后,可以选择使用TempData(如果启用了会话),也可以为当前用户动态检索TempData。如果您不担心用户修改它们,那么我会使用一个简单的隐藏字段,或者将其放置在帖子的路由值中,让框架为您完成这项工作。

这就是DTO(数据传输对象)派上用场的地方

视图使用DTO作为其模型。DTO根据属性镜像实体对象,但不包括您不希望用户能够操作的属性

然后,在控制器中,当您准备持久化实体时,您将创建一个新的实体对象,并从要传递给操作的数据中获取属性,然后将它们复制到实体对象。此时,您可以设置UpdatedBy属性

为了简化将属性从实体映射到DTO(反之亦然)的过程,可以查看,如果属性使用相同的名称,它将自动处理此问题


如果您只是将实体传递给视图,则用户可能会更改您不希望它们能够更改的属性值。

您不能使用用户会话数据(通过成员资格或任何提供程序)在服务器中检索updatedBy值吗?在这个特定实例中,我可以从会话中提取值,我只是不确定在哪里截取实体并更新值。如果我在导航属性中添加一个“set”主体,它希望我也添加“get”主体,我不知道这是否是我应该做的。@Kizmar如果您使用的是自动属性,那么没有get的集合没有任何价值。所以我不知道你在问什么。由于可以从会话中提取值,那么您可以让框架为您填写用户输入,您可以在保留实体之前填写其余的内容。请原谅我在这方面的无知。“在持久化实体之前,您将填写其余的内容”这一部分是我感到困惑的地方。如果在HttpPost发生时框架设置了90%的属性,那么我应该在哪里填写其余的10%?我曾在控制器中的[HttpPost]创建(EntityA entity)方法中尝试过这样做,但只要我尝试修改实体,我就会得到“一个实体对象不能被多个EntityChangeTracker实例引用。”(例如,执行类似“entity.UpdatedBy_Id=1;”的操作……刚刚解决了上面提到的错误。在对模型进行了多次更改之后,我现在设置了“\u id”属性,而不是直接设置导航属性。这是可行的,请注意,用户可以使用Firebug或类似工具更改隐藏字段的值。。。