c# – MVC 4 /实体框架5 /代码优先 – 在视图中保留集合(对象列表) – 几个问题

我的项目有几个模型,其中一些模型与其他模型有很多关系.用户具有配置文件页面,该页面被分成几个部分视图 – 每个视图分组/表示给定模型的特定属性.

例如,如果我想在局部视图中显示给定模型的10个属性中的5个,并且想要将未显示的属性保留给用户我正在使用Html.HiddenFor就像这样

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

这适用于上面的单个输入属性.在5个隐藏成员属性中,其中一个可能是列表.我知道使用HiddenFor无法保留列表.我遇到了Mvc Futures包和Html.Serialize帮助扩展,但我不完全确定如何使用它并且无法找到很多关于它的信息.

>将模型传递给视图后,我们可以访问与其关联的所有内容(属性,集合). Model.Username.例如,如果我们不使用带有用户名的HiddenFor,这是否意味着它将被重置为默认值,或者为null?收藏品是否相同?
>使用Hidden是唯一/最佳方式来保留未向用户显示的模型属性吗?
>使用Html.Serialize唯一的方法是持久保存未向用户显示的模型集合吗?其他选择?
>有人可以提供/链接到一个简单的示例,说明如何在类似于我所描述的情况下持久保存集合吗?
>如果我要使用Html.Serialize,整个模型是否需要序列化,还是我可以序列化集合?

反馈意见.

最佳答案 您不需要通过从模型创建所有字段(隐藏或不隐藏)来“保留”模型中的任何数据.在控制器中,更新数据库中的记录时,您只需更新所需内容,其余内容不会受到影响.

假设这是您的产品型号

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; }
}

如果您只想在视图中编辑名称和描述,那么您只能放置这些字段,并跳过其余字段(ID将位于隐藏字段中).提交表单后,在控制器中,您将通过传入的ID引用产品记录,然后您可以将名称和描述更新为从表单收到的内容.类别和价格不会受到影响.

更直接的方法是使用特定于视图的ViewModel,而不使用不可编辑的属性.我发现这篇文章提供了更多细节如何执行此操作:

Successful Model Editing without a bunch of hidden fields

在较小的项目中,您没有使用任何类型的库(AutoMapper,InjectValues,…),但您可以在需要将值从ViewModel复制到DB的实际记录的地方自己完成.

点赞