我的项目有几个模型,其中一些与其他模型有1:many关系。用户有一个配置文件页面,它被分割成几个部分视图——每个分组/表示给定模型的特定属性。
例如,如果我想在局部视图中显示给定模型的10个属性中的5个,并且想要保留不显示给用户的属性,我使用Html.HiddenFor
,如下
@Html.HiddenFor(x => x.IsInGroup)
这适用于如上的单条目属性。在5个隐藏的成员属性中,其中一个可能是列表。我理解不能使用HiddenFor
来持久化列表。我遇到了Mvc期货包和Html.Serialize
助手扩展,但我不完全确定如何使用它,并没有能够找到很多好的信息。
- 一旦一个模型被传递给一个视图,与它相关的一切(属性,集合)都可供我们访问,例如
Model.Username
。例如,如果我们不使用HiddenFor
与Username
,这是否意味着它将重置为默认值,或空?这对催收也是一样的吗? - 使用
HiddenFor
是唯一/最好的方式来坚持一个模型的属性,不显示给用户? - 使用
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; }
}
如果您只想在视图中编辑Name和Description,那么您只能放置这些字段,并跳过其他字段(ID将在隐藏字段中)。当提交表单时,您将在控制器中通过传入的ID引用Product记录,然后您可以将Name和Description更新为从表单收到的内容。类别和价格不受影响。
更直接的方法是使用特定于视图的ViewModel,没有不可编辑的属性。我发现这篇文章给出了更多的细节如何做到这一点:没有隐藏字段的成功模型编辑
在一个较小的项目中,你不需要使用任何类型的库(AutoMapper, InjectValues,…),但你可以在需要将ViewModel的值复制到DB的实际记录的地方自己做。