1

我刚刚在我的 MVC 应用程序中遇到了一个小错误。

管理员可以编辑用户配置文件。包括用户所在的角色。

所以我有一个“EditUser”的ViewModel:

public class EditUserViewModel
{
    public User User { get; set; }
    public IEnumerable<SelectListItem> PossibleRoles { get; set; }
    public int[] SelectedRoles { get; set; }
}

因此,在我的 EditUser.cshtml 页面上,我只需运行一个 @Html.EditorFor(Model => model.User) 根据我的 MetaData 类的限制生成所需的字段。

在那里,例如,我做了这样的注释:

    [ScaffoldColumn(false)]
    public string Password { get; set; }

这样做的问题是,当我回发我的编辑表单时,设置为 Scaffold false 的值是空的。这似乎有点合乎逻辑,因为这些属性没有编辑框。

所以当我保存我的实体时,它会用 null 覆盖值。(例如,如果我更新用户名并保存,用户的密码被 null 覆盖并且 EF 抛出错误)有什么方法可以自动更新值(根据我能够编辑的值(MetaDataClasses)? ) ? 否则,如果我将它们复制到从实体框架中新获取的实体中,并且我应该将注释更改为 Scaffold(false),我需要在代码中添加一条规则,以便将新值复制到实体中。这似乎是错误的。

提前致谢。

4

2 回答 2

2

EF 适用于整个实体,如果您决定不显示实体的某些部分,您还必须在保存更改时在某处处理此问题。您有多种选择:

  • 如果您不想显示其所有数据,请不要使用该实体。使用特殊的视图模型,而不是只包含您想要显示的数据。使用该视图模型来收集更改并将它们复制到实体(例如,您可以使用 AutoMapper 将实体转换为视图模型,反之亦然)。
  • 从数据库加载实体并仅更新要从编辑视图模型中保留的字段
  • 不要将整个用户实体设置为已更新。而是手动设置要更新的每个属性。
于 2012-08-06T17:45:21.010 回答
0

您也可以使用隐藏输入。不过,不确定这样做是否是一个好主意。

@Html.HiddenFor(model => model.Property)
于 2013-02-28T19:31:02.707 回答