我的项目有几个模型,其中一些模型与其他模型有很多关系.用户具有配置文件页面,该页面被分成几个部分视图 – 每个视图分组/表示给定模型的特定属性.
例如,如果我想在局部视图中显示给定模型的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的实际记录的地方自己完成.