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

时间:2019-07-08 03:18:21

标签: c# asp.net-core razor-pages

我正在创建一个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集合,但是我只想绑定到propertyC(在其他时间点,所有这些对象的propertyA和propertyB已经建立)

2 个答案:

答案 0 :(得分:1)

这只是您为输入命名的原因;它必须采用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)

但是,我认为您实际上正在苦苦挣扎的是您的“现有”收藏夹实际上并不存在的事实。每个请求都是唯一的,并且仅存在与该请求一起发送的事物。最初用一些东西填充视图的事实是无关紧要的。除非您将完整的收藏集发回,否则它将不存在。

不是您应该将其发回。所发布的所有内容都可能会被修改,并且如果您不希望修改PropertyAPropertyB,则不应对其进行发布。那那会留在哪里呢?映射。

您想要做的只是对所有项目发布PropertyC。然后,您获取了MyObject实例的完全填充列表,但是您可以使用它(查询数据库等)。然后,您遍历一个列表或另一个列表,并将PropertyC的值映射到完全填充的列表:

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

FWIW,您可能还想发布关联ID或类似名称。上面的方法依赖于收集前后的顺序相同,但这并不总是可以保证的。

答案 1 :(得分:0)

您可以使用foreach将数据绑定到propertyC,就像这样:

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