-1

我在 .NET 5 中有一个 Blazor Server 项目,它在特定页面中给了我一些非常奇怪的行为。

我有一个名为的页面Products,其中包含一个名为的自定义组件ProductSettings,该组件需要两个列表 - aList<Location>和 a List<Product>。该页面继承自BasePage执行一些初步查找(业务信息等)的 a。Products页面如下所示:

<ProductSettings Products="@products" Locations="@locations"></ProductSettings>

OnParametersSet对页面和组件都使用了这些方法。页面方法如下所示:

    protected List<Product> products { get; set; }
    protected List<string> locations { get; set; }

    protected override void OnParametersSet()
    {
        log.LogTrace("Products.ParametersSet start");
        products = new List<Product>();
        locations = locationRepo.GetLocationsByBusiness(business!.BusinessId).Select(x => 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

对于我的生活,我无法理解它为什么会这样做。它似乎完全覆盖了列表中的前四个记录。我有其他页面使用类似的方法,我没有遇到任何这样的问题。最初我认为它与我的回购或诸如此类的其他逻辑有关,我已经探索了文档,List<T>但我找不到任何说对象会像这样合并的东西。我也有单元测试来验证和完整性检查AddRange以及我的其他逻辑,并且我的库中的所有内容都是一致的 - 只有在这个 Blazor 页面中,我才得到这种奇怪。

4

1 回答 1

0

ProductsRepo其中有逻辑,它将查找某个位置的产品,如果它们不存在,它将返回一个产品列表Business(用作默认值)。我能得出的唯一合理的结论是,这样做会以某种方式弄乱对象,考虑到它在重复测试不同场景后通过了单元测试,这很奇怪。

这里故事的寓意可能是对这些事情进行单独的调用,我一开始就应该这样做。

于 2021-12-03T21:54:41.817 回答