【问题标题】:MVC3, Models, Create & Edit Hidden FieldsMVC3、模型、创建和编辑隐藏字段
【发布时间】:2011-08-09 06:38:58
【问题描述】:

我的 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”主体来这样做? ...或者...这应该在控制器中的 HttpPost 上吗?

【问题讨论】:

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

标签: asp.net-mvc-3 models edit hidden


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 在这个特定的实例中,我可以从 Session 中提取值,我只是不确定在哪里拦截实体并更新值。如果我向导航属性添加“set”主体,它希望我也添加“get”主体,我不知道这是否是我应该做的。
    • @Kizmar 如果您使用自动属性,那么没有获取的集合没有任何价值。所以我不确定你在问什么。由于可以从 Session 中提取值,因此您可以让框架为您填写用户输入,您将在持久化实体之前填写其余部分。
    • 请原谅我对此的无知。 “您将在保留实体之前填写其余部分”部分是我感到困惑的地方。如果 HttpPost 发生时框架设置了 90% 的属性,那么我在哪里填写另外 10%?我已经尝试在控制器的 [HttpPost] Create(EntityA entity) 方法中这样做,但是一旦我尝试修改实体,我就会得到“一个实体对象不能被多个 IEntityChangeTracker 实例引用”。 (例如,执行“entity.UpdatedBy_Id = 1;”之类的操作)
    • ...刚刚发现上面提到的错误。在对模型进行多次更改后,我现在设置“_id”属性,而不是尝试直接设置导航属性。
    【解决方案3】:

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

    【讨论】:

    • 这行得通,只需要注意用户可以使用 Firebug 或类似工具更改隐藏字段的值...
    猜你喜欢
    • 1970-01-01
    • 2012-08-14
    • 2011-08-09
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 2019-07-19
    相关资源
    最近更新 更多