Как привязать к одному свойству существующую коллекцию объектов - PullRequest
1 голос
/ 08 июля 2019

Я создаю приложение ASP.NET Core Razor Pages. У меня есть коллекция объектов, которые имеют несколько свойств, которые уже установлены, с одним свойством, которое необходимо установить. Я не уверен, как связать входные данные с этим одним свойством при сохранении существующих значений для других свойств.

Я видел ресурсы о том, как смоделировать связывание со сложной коллекцией, но я не думаю, что этот подход будет работать, поскольку создается впечатление, что он создает новый экземпляр типа объекта, и я хочу иметь возможность сделать это с моя существующая коллекция предметов. РЕДАКТИРОВАТЬ: https://www.learnrazorpages.com/razor-pages/model-binding

Ex.

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 ]

1 голос
/ 08 июля 2019

Это как раз то, что вы называете вводом; он должен быть в форме 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)

Тем не менее, я думаю, что вы на самом деле боретесь с тем, что ваш "существующий" набор на самом деле не существует. Каждый запрос уникален, и существуют только те вещи, которые были буквально отправлены вместе с этим запросом. Тот факт, что вы изначально заполнили представление каким-либо набором вещей, несущественен. Если вы не отправите обратно эту полную коллекцию, она больше не существует.

Не то чтобы вы должны опубликовать его обратно. Все, что публикуется, потенциально может быть изменено, и если вы не хотите, чтобы PropertyA и PropertyB были изменены, они не должны публиковаться. Так, что это оставляет тебя? Mapping.

То, что вы хотите сделать, это просто опубликовать PropertyC для всех предметов. Затем вы выбираете свой полностью заполненный список MyObject экземпляров, как только вы это делаете (база данных запросов и т. Д.) Затем вы перебираете один или другой список и сопоставляете значение PropertyC со своим полностью заполненным списком:

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

FWIW, вы также можете опубликовать ассоциированный ID или подобное. Приведенный выше метод основан на том, что порядок сбора одинаков как до, так и после, что не всегда гарантируется.

0 голосов
/ 08 июля 2019

Вы можете использовать foreach для привязки данных к свойству C, например:

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