4

我的项目有几个模型,其中一些与其他模型具有 1:many 关系。一个用户有一个个人资料页面,它被分成几个部分视图——每个视图分组/代表给定模型的特定属性。

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

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

这适用于上面的单条目属性。在 5 个隐藏的成员属性中,其中之一可能是列表。我了解无法使用HiddenFor. 我遇到了 Mvc Futures 包和Html.Serialize辅助扩展,但我不完全确定如何使用它,也找不到很多好的信息。

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

反馈表示赞赏。

4

1 回答 1

2

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

假设这是您的产品模型

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 而没有不可编辑的属性。我发现这篇文章提供了更多详细信息:

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

在一个较小的项目中,您没有使用任何类型的库(AutoMapper、InjectValues、...),但是您可以在需要将 ViewModel 中的值复制到 DB 中的实际记录中的地方自己进行操作。

于 2013-03-11T18:12:46.963 回答