Поведение списка серверов Blazor при загрузке страницы

#c# #.net-5 #blazor-server-side #blazor-component

Вопрос:

У меня есть проект сервера Blazor в .NET 5, который дает мне невероятно странное поведение на определенной странице.

У меня есть страница с именем Products , которая содержит пользовательский компонент с именем ProductSettings , который принимает два списка — a Listlt;Locationgt; и a Listlt;Productgt; . Страница наследуется от a BasePage , которая выполняет предварительный поиск (бизнес-информация и т.д.). Products Страница выглядит так:

 lt;ProductSettings Products="@products" Locations="@locations"gt;lt;/ProductSettingsgt;  

Я использую OnParametersSet методы как для страницы, так и для компонента. Метод страницы выглядит следующим образом:

 protected Listlt;Productgt; products { get; set; }  protected Listlt;stringgt; locations { get; set; }   protected override void OnParametersSet()  {  log.LogTrace("Products.ParametersSet start");  products = new Listlt;Productgt;();  locations = locationRepo.GetLocationsByBusiness(business!.BusinessId).Select(x =gt; x.Handle).ToList();    var l1 = productsRepo.GetProducts(locations[0], business!.BusinessId);    log.LogTrace(@"{Loc0} location ids:",locations[0]);  foreach (var l in l1)  {  log.LogTrace(l.LocationId);  }   var l2 = productsRepo.GetProducts(locations[1], business!.BusinessId);  log.LogTrace(@"{Loc0} location ids:",locations[1]);  foreach (var l in l2)  {  log.LogTrace(l.LocationId);  }  products.AddRange(l1);  products.AddRange(l2);    log.LogTrace("main array location ids:");  foreach (var p in products)  {  log.LogTrace(p.LocationId);  }  log.LogTrace("Products page params set");  base.OnParametersSet();  }  

Методы locationRepo.GetLocationsByBusiness и productsRepo.GetProducts являются синхронными и извлекают данные из хранилища таблиц Azure.

Ошибка, которую я получаю, заключается в том, что, несмотря на то, что мой цикл проходит и собирает Product данные для каждого Location успешно (у меня есть 2 местоположения, в каждом из которых 4 продукта), я получаю список из 8 продуктов, которые все соответствуют второму набору продуктов. Другими словами, в приведенном выше коде я получаю этот вывод трассировки:

 09:38:28 trce: AdminSite.Components.BasePage[0] business-1 location ids: 09:38:28 trce: AdminSite.Components.BasePage[0] business-1 09:38:28 trce: AdminSite.Components.BasePage[0] business-1 09:38:28 trce: AdminSite.Components.BasePage[0] business-1 09:38:28 trce: AdminSite.Components.BasePage[0] business-1  09:38:28 trce: AdminSite.Components.BasePage[0] business-2 location ids: 09:38:28 trce: AdminSite.Components.BasePage[0] business-2 09:38:28 trce: AdminSite.Components.BasePage[0] business-2 09:38:28 trce: AdminSite.Components.BasePage[0] business-2 09:38:28 trce: AdminSite.Components.BasePage[0] business-2  09:38:28 trce: AdminSite.Components.BasePage[0] main array location ids: 09:38:28 trce: AdminSite.Components.BasePage[0] business-2 09:38:28 trce: AdminSite.Components.BasePage[0] business-2 09:38:28 trce: AdminSite.Components.BasePage[0] business-2 09:38:28 trce: AdminSite.Components.BasePage[0] business-2 09:38:28 trce: AdminSite.Components.BasePage[0] business-2 09:38:28 trce: AdminSite.Components.BasePage[0] business-2 09:38:28 trce: AdminSite.Components.BasePage[0] business-2 09:38:28 trce: AdminSite.Components.BasePage[0] business-2   

Хоть убей меня, я не могу понять, почему он это делает. Похоже, что он полностью перезаписывает первые четыре записи в списке. У меня есть другие страницы, использующие аналогичный подход, и я не сталкиваюсь с подобными проблемами. Изначально я думал, что это как-то связано с другими элементами логики в моих репозиториях или чем-то еще, и я изучил документацию Listlt;Tgt; , но не могу найти ничего, что говорит о том, что объекты будут сливаться подобным образом. У меня также есть модульные тесты для проверки и проверки на вменяемость AddRange и другая моя логика, и в моих библиотеках все согласовано — только на этой странице Blazor я получаю эту странность.

Комментарии:

1. Мы не можем точно сказать, не увидев, что productsRepo.GetProducts происходит. Если именно оттуда берутся экземпляры продукта, то это вероятный виновник. List.AddRange никогда никоим образом не изменяет предоставленные экземпляры. Кроме того, не могли бы вы попробовать воспроизвести что-нибудь простое, например консольное приложение? У меня очень сильное подозрение, что это не имеет никакого отношения к Blazor, поскольку то, что вы получаете, является ошибкой в обычном коде C#.

2. обновил код, чтобы упростить и подчеркнуть, что проблема исходит от Blazor, а не от кода РЕПО (который я тестировал много раз на данный момент)

3.Спасибо, что добавили дополнительную информацию и поправили меня. Не могли бы вы сделать круг l1 после того, как получите l2 деньги из РЕПО, просто чтобы быть абсолютно уверенным?

4. Ладно, я так и сделал, и теперь они оба выкладывают одни и те же ценности! Я схожу с ума или этому есть простое объяснение?!

5. Наиболее вероятным объяснением является то, что вы productsRepo модифицируете продукты, возвращенные GetProducts при последующих вызовах.

Ответ №1:

ProductsRepo в нем была логика, в которой он искал бы продукты для определенного местоположения, и если бы они не существовали, он вернул бы список продуктов для a Business (который используется по умолчанию). Единственный правдоподобный вывод, к которому я мог прийти, заключается в том, что, делая это, он каким-то образом испортил объекты, что было очень странно, учитывая, что он прошел модульное тестирование после повторного тестирования различных сценариев.

Мораль этой истории, вероятно, состоит в том, чтобы сделать отдельные призывы к таким вещам, которые я должен был сделать в первую очередь.