10
respostas

[Dúvida] Como recupero o nome e o Id

fiquei com uma duvida, em caso de ter dois Artistas com o mesmo nome, quando faço a consulta, acaba retornando sempre o primeiro registro sendo que clickei em outro, como poderia retornar o artista que eu cliquei trazendo seu id junto? Para assim eu poder excluir ele. Pensei em algumas formas mas não sei se seria a certa

10 respostas

Olá Filipi! tudo bom camarada?

Entendo sua dúvida e é uma situação comum quando lidamos com dados que podem ter duplicidade, como nomes de artistas. Para garantir que você está manipulando o artista correto, especialmente quando há duplicados, é importante trabalhar com o Id único de cada artista.

No seu caso, parece que a navegação está sendo feita usando apenas o nome do artista como parâmetro de rota. Isso pode causar problemas se houver artistas com o mesmo nome. Uma solução seria modificar a rota para incluir o Id do artista, que é único, garantindo que você está acessando o artista correto.

Aqui está uma sugestão de como você pode ajustar isso:

  1. Modificar a Rota: Altere a rota para incluir o Id do artista:

    @page "/EditarArtista/{ArtistaId:int}"
    
  2. Atualizar o Código para Passar o Id: No componente CardArtista.razor, modifique o Href para passar o Id em vez do nome:

    <MudCardActions>
        <MudButton Color="Color.Warning"
                   Variant="Variant.Outlined"
                   Href=@($"/EditarArtista/{Artista!.Id}")>Detalhes</MudButton>
    </MudCardActions>
    
  3. Ajustar o Código para Receber o Id: No componente EditarArtista.razor, ajuste para receber o Id como parâmetro e buscar o artista por esse Id:

    [Parameter]
    public int ArtistaId { get; set; }
    
    protected override async Task OnInitializedAsync()
    {
        Artista = await artistasAPI.GetArtistaPorIdAsync(ArtistaId);
        nome = Artista!.Nome;
        biografia = Artista!.Bio;
    }
    
  4. Adicionar Método para Buscar por Id: No ArtistasAPI.cs, adicione um método para buscar o artista pelo Id:

    public async Task<ArtistaResponse?> GetArtistaPorIdAsync(int id)
    {
        return await _httpClient.GetFromJsonAsync<ArtistaResponse>($"artistas/{id}");
    }
    

Com essas alterações, você deve ser capaz de garantir que está sempre manipulando o artista correto, mesmo que haja duplicidade de nomes. Espero que essa abordagem ajude a resolver o problema que você está enfrentando.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.Bons Estudos!

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

consegui pegar o id do artista mas agora meu Artista está retornando null, com o seguinte erro que recuperei no try-catch, esse erro fala que ele não consegue encontrar, acredito que ele não esteja conseguindo pegar o artista, e coloquei os codigos do mesmo jeito acima:

System.Net.Http.HttpRequestException: Response status code does not indicate success: 404 (Not Found). at System.Net.Http.HttpResponseMessage.EnsureSuccessStatusCode() at System.Net.Http.Json.HttpClientJsonExtensions.<g__Core|12_0>d2[[ScreenSound.Web.Response.ArtistaResponse, ScreenSound.Web, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Text.Json.JsonSerializerOptions, System.Text.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51]].MoveNext() at ScreenSound.Web.Services.ArtistaAPI.GetArtistaPorIdAsync(Int32 id) in C:\Users\Usuario\Source\Repos\ScreenSound.API\ScreenSound.Web\Services\ArtistaAPI.cs:line 38 at ScreenSound.Web.Pages.EditarArtista.OnInitializedAsync() in C:\Users\Usuario\Source\Repos\ScreenSound.API\ScreenSound.Web\Pages\EditarArtista.razor:line 52

O que pode ser feito?

Filipi, o Artista está como null, pq provavelmente o GetArtistaPorIdAsync está retornando 404, não encontrando a informação pelo ID. Você pode postar como está sua classe ArtistaAPI?

PS: Se tiver esse projeto no Git e puder compartilhar o link melhor ainda.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Ainda não coloquei no Git mas vou providenciar isso agora para as proximas duvidas, mas aqui está meu ArtistaAPI

Filipe, valeu.

Pode disponibilizar também os endpoints de artista no projeto da API?

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Filipi,

Você não tem o endpoint que faz a consulta pelo Id, você precisa criar e pode usar como base o que consulta pelo nome, ficaria assim:

 app.MapGet("/Artistas/{id}", ([FromServices] DAL<Artista> dal, int id) =>
        {
            var artista = dal.RecuperarPor(a => a.Id==id));
            if (artista is null)
            {
                return Results.NotFound();
            }
            return Results.Ok(EntityToResponse(artista));

        });
        ```

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeEstava dando esse esse erro de conflito, então arrumei para: Insira aqui a descrição dessa imagem para ajudar na acessibilidadeai teria que alterar aqui também certo? Insira aqui a descrição dessa imagem para ajudar na acessibilidadeInsira aqui a descrição dessa imagem para ajudar na acessibilidadeporem começou a dar esse erro: System.Net.Http.HttpRequestException: TypeError: Failed to fetch ---> TypeError: Failed to fetch --- End of inner exception stack trace --- at System.Net.Http.BrowserHttpInterop.d__131[[System.Runtime.InteropServices.JavaScript.JSObject, System.Runtime.InteropServices.JavaScript, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a]].MoveNext() at System.Net.Http.BrowserHttpHandler.CallFetch(HttpRequestMessage request, CancellationToken cancellationToken, Nullable1 allowAutoRedirect) at System.Net.Http.BrowserHttpHandler.g__Impl|53_0(HttpRequestMessage request, CancellationToken cancellationToken, Nullable1 allowAutoRedirect) at Microsoft.Extensions.Http.Logging.LoggingHttpMessageHandler.<SendCoreAsync>g__Core|5_0(HttpRequestMessage request, Boolean useAsync, CancellationToken cancellationToken) at Microsoft.Extensions.Http.Logging.LoggingScopeHttpMessageHandler.<SendCoreAsync>g__Core|5_0(HttpRequestMessage request, Boolean useAsync, CancellationToken cancellationToken) at System.Net.Http.HttpClient.<SendAsync>g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsCts, CancellationToken originalCancellationToken) at System.Net.Http.Json.HttpClientJsonExtensions.<<FromJsonAsyncCore>g__Core|12_0>d2[[ScreenSound.Web.Response.ArtistaResponse, ScreenSound.Web, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Text.Json.JsonSerializerOptions, System.Text.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51]].MoveNext() at ScreenSound.Web.Services.ArtistaAPI.GetArtistaPorIdAsync(Int32 id) in C:\Users\Usuario\Source\Repos\ScreenSound.API\ScreenSound.Web\Services\ArtistaAPI.cs:line 38 at ScreenSound.Web.Pages.EditarArtista.OnInitializedAsync() in C:\Users\Usuario\Source\Repos\ScreenSound.API\ScreenSound.Web\Pages\EditarArtista.razor:line 52

consegui resolver o conflito colocando a rota da endpoint assim: Insira aqui a descrição dessa imagem para ajudar na acessibilidadee depois alterando no metodo GetArtistaPorIdAsync: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Muito obrigado pela ajuda André