es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Comportamiento de la lista de Blazor Server en carga de página.

Tengo un proyecto de Blazor Server en .NET 5 que me está dando un comportamiento increíblemente extraño en una página en particular.

Tengo una página llamada “Productos” que contiene un componente personalizado llamado “ProductSettings” que toma dos listas: una “List<Location>” y una “List<Product>”. La página hereda de una “BasePage” que realiza algunas búsquedas preliminares (información comercial, etc.). La página “Productos” se ve así:

<productsettings products="@products" locations="@locations"></productsettings>

Uso métodos “OnParametersSet” tanto para la página como para el componente. El método de la página se ve así:

    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();
    }

Los métodos “locationRepo.GetLocationsByBusiness” y “productsRepo.GetProducts” son síncronos y extraen datos del almacenamiento de tabla Azure.

El error que estoy obteniendo, a pesar de que mi bucle recorre y recoge los datos de “Productos” para cada “Location” con éxito (tengo 2 ubicaciones cada una con 4 productos), es que termino con una lista de 8 productos que todos coinciden con el segundo conjunto de productos. En otras palabras, en el código anterior, obtengo esta salida de traza:

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

Por ningún motivo puedo entender por qué está haciendo esto. Parece estar sobrescribiendo completamente los primeros cuatro registros en la lista. Tengo otras páginas que usan un enfoque similar y no estoy teniendo problemas como este. Inicialmente pensé que tenía algo que ver con otros bits de lógica en mis repos o algo así, y he explorado la documentación de “List<T>”, pero no puedo encontrar nada que diga que los objetos se fusionarían de esta manera. También tengo pruebas unitarias para verificar y verificar la cordura de “AddRange” y mi otra lógica, y todo es consistente en mis bibliotecas. Solo en esta página Blazor estoy obteniendo esta extrañeza.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Problema con proyecto Blazor Server en .NET 5

    Como experto en TI especializado en c#, .net-5, blazor-server-side, blazor-component, puedo ver que el error está ocurriendo en la página de Productos que contiene un componente personalizado llamado ProductSettings que toma dos listas- una List y una List. Se llama al método OnParametersSet tanto para la página como para el componente, donde se declaran los productos y las ubicaciones, que luego llama a locationRepo.GetLocationsByBusiness y productsRepo.GetProducts para extraer datos de Azure table storage.

    En el código anterior, el problema es que un bucle está pasando y recogiendo datos de Producto para cada Ubicación correctamente, pero el código termina con una lista de 8 productos que coinciden todos con el segundo conjunto de productos, a pesar de tener 2 ubicaciones cada una con 4 productos. Incluso después de usar el método AddRange, ocurre el mismo problema, y no hay problema con otras páginas que usan un enfoque similar.

    Al analizar el problema, parece que se está sobrescribiendo completamente los primeros cuatro registros en la Lista. Sin embargo, no hay indicación en la documentación de List para que los objetos se fusionen de esta manera.

    Como solución, sugiero verificar los datos y asegurarse de que los objetos se estén mapeando correctamente. También podemos probar los datos mediante la depuración de la aplicación y la adición de declaraciones de registro para ver cómo se están pasando los datos a través de la aplicación. También podemos modificar el código para usar una nueva instancia de productos para cada ubicación, y luego usar el método AddRange para combinar cada conjunto de resultados en una sola lista.

    Otro enfoque es cambiar de llamadas síncronas a asincrónicas, que es un enfoque mejor para manejar el flujo de datos cuando se utiliza .NET 5. También podemos intentar utilizar un semáforo para controlar el modelo de enhebrado del código cuando se cargan datos desde repositorios, lo que nos permitiría continuar con el código hasta que se hayan cargado correctamente todos los datos.

    En general, el problema se debe principalmente a cómo se están cargando los datos, y la forma en que se están mapeando los objetos en el código, lo que está causando el problema con la fusión de objetos.

Comments are closed.