如何绑定到现有对象集合中的一个 属性

How to bind to one property of an existing collection of objects

我正在创建 ASP.NET Core Razor Pages 应用程序。我有一组对象,这些对象具有多个已设置的属性,其中一个 属性 需要设置。我不确定如何在保持其他属性的现有值的同时将输入绑定到那个 属性。

我看过有关如何建模绑定到复杂集合的资源,但我认为这种方法行不通,因为这似乎创建了对象类型的新实例,我希望能够做到这与我现有的对象集合。编辑:https://www.learnrazorpages.com/razor-pages/model-binding

例如

List<MyObject> objectList;

class MyObject {
   public int propertyA { get; set; }
   public int propertyB { get; set; }
   public int propertyC { get; set; }
}

在上述示例的上下文中,我想将我的输入绑定到 objectList 集合,但我只想绑定到 属性C(在其他某个时间点,属性所有这些对象的 A 和 属性B 已经建立)

您可以使用 foreach 将数据绑定到 propertyC,例如:

foreach (var item in objectList)
{
    item.propertyC = 50; //Bind the value that you want
}

这取决于您为输入命名;它需要采用 CollectionProperty[N].PropertyC 的形式,其中 N 是索引。假设您都绑定到 List<MyObject> 并将其用作您的视图模型:

@for (var i = 0; i < Model.Count; i++)
{
    <input asp-for="@Model[i].PropertyC" />
}

这对应于一个动作参数,例如:

public IActionResult Foo(List<MyObject> myObjects)

但是,我认为您实际上 苦恼的是您的"existing" collection 实际上并不存在。每个请求都是唯一的,唯一存在的是与该请求一起发送的内容。您最初使用一些 collection 填充视图这一事实是无关紧要的。除非你 post 备份完整 collection,否则它不再存在。

不是说你应该post它回来。任何被 posted 的东西都可能被修改,如果你不想 PropertyAPropertyB 被修改,它们不应该被 posted。那么,那会给你留下什么?映射。

您想要做的是 post 所有项目 PropertyC。然后,您可以获取完全填充的 MyObject 实例列表,无论您如何处理(查询数据库等)。然后,您遍历一个列表或另一个列表,并将 PropertyC 的值映射到完全填充的列表:

for (var i = 0; i < existingMyObjects.Count; i++)
{
    existingMyObjects[i].PropertyC = myObjects[i].PropertyC;
}

FWIW,您可能还想 post 关联 ID 或类似 ID。上述方法依赖collection前后顺序相同,并不总是保证。