MVC 4 /实体框架5 /代码优先-在视图中持久化一个集合(对象列表)-几个问题

本文关键字:集合 几个问题 列表 对象 持久化 一个 视图 框架 实体 代码 MVC | 更新日期: 2023-09-27 18:03:23

我的项目有几个模型,其中一些与其他模型有1:many关系。用户有一个配置文件页面,它被分割成几个部分视图——每个分组/表示给定模型的特定属性。

例如,如果我想在局部视图中显示给定模型的10个属性中的5个,并且想要保留不显示给用户的属性,我使用Html.HiddenFor,如下

@Html.HiddenFor(x => x.IsInGroup)

这适用于如上的单条目属性。在5个隐藏的成员属性中,其中一个可能是列表。我理解不能使用HiddenFor来持久化列表。我遇到了Mvc期货包和Html.Serialize助手扩展,但我不完全确定如何使用它,并没有能够找到很多好的信息。

  • 一旦一个模型被传递给一个视图,与它相关的一切(属性,集合)都可供我们访问,例如Model.Username。例如,如果我们不使用HiddenForUsername,这是否意味着它将重置为默认值,或空?这对催收也是一样的吗?
  • 使用HiddenFor是唯一/最好的方式来坚持一个模型的属性,不显示给用户?
  • 使用Html.Serialize是唯一的方法,坚持一个模型的集合,不显示给用户?其他选项吗?
  • 有人可以提供/链接到一个简单的例子,如何在类似于我所描述的情况下持久化一个集合?
  • 如果我要使用Html.Serialize,整个模型是否需要序列化,或者我可以只是序列化集合?

反馈感激。

MVC 4 /实体框架5 /代码优先-在视图中持久化一个集合(对象列表)-几个问题

您不需要通过从模型中创建所有字段(隐藏或不隐藏)来"持久化"模型中的任何数据。在控制器中,当更新数据库中的记录时,您只需更新您需要的内容,其余部分不会受到影响。

假设这是你的产品模型

class Product { 
    public int ID {get; set;}
    public string Name {get; set;} 
    public string Description {get; set;}
    public decimal Price {get; set;}
    public virtual ICollection<Category> Categories { get; set; }
}

如果您只想在视图中编辑Name和Description,那么您只能放置这些字段,并跳过其他字段(ID将在隐藏字段中)。当提交表单时,您将在控制器中通过传入的ID引用Product记录,然后您可以将Name和Description更新为从表单收到的内容。类别和价格不受影响。

更直接的方法是使用特定于视图的ViewModel,没有不可编辑的属性。我发现这篇文章给出了更多的细节如何做到这一点:

没有隐藏字段的成功模型编辑

在一个较小的项目中,你不需要使用任何类型的库(AutoMapper, InjectValues,…),但你可以在需要将ViewModel的值复制到DB的实际记录的地方自己做。