2011-08-08 134 views
0

我有一些模型在我的MVC3网络应用程序中,当用户创建或编辑对象/实体时,需要设置“幕后”字段。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

您不能使用用户会话数据(通过成员资格或任何提供者)来检索服务器中的updatedBy值吗? – AJC

回答

0

我宁愿在用户控制之外放置这样的字段。特别是如果它们是整数字段,用户可以编辑以制作假记录。然后选择使用TempData(如果会话已启用)或可能为当前用户即时检索它。如果您不担心用户修改它们,那么我会使用一个简单的隐藏字段或将其放置在帖子的路径值中,从而允许框架为您完成工作。

+0

在这个特定的实例中,我可以从Session中提取值,我只是不知道在哪里拦截实体和更新值。如果我为导航属性添加一个“set”主体,它希望我也添加“get”主体,并且我不知道这是我应该做的。 – Kizmar

+0

@Kizmar很好,如果你使用自动属性,没有get没有任何值的集合。所以我不确定你在问什么。由于该值可以从会话中提取,因此您可以让框架为您填写用户输入,并且在持久化实体之前填写剩余的值。 –

+0

请原谅我对此的无知。 “在坚持实体之前你会填写剩下的部分”部分是我困惑的地方。如果HttpPost发生时90%的属性是由框架设置的,我在哪里填写其他10%?我试过在控制器的[HttpPost] Create(EntityA entity)方法中这样做,但只要我试图修改实体,我就会得到“一个实体对象不能被多个IEntityChangeTracker实例引用。 (例如,做一些像“entity.UpdatedBy_Id = 1;”) – Kizmar

0

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

+0

这个工程,只知道用户可以使用Firebug或类似的更改隐藏字段的值... – Romias

1

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

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

然后在您的控制器中,当您准备好坚持实体时,您将创建一个新的实体对象,并将DTO中的属性传递给动作并将其复制到您的实体对象。现在您可以设置UpdatedBy属性。

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

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