PROBLEMAS COM POST CONSUMINDO WEB API

 Tópico anterior Próximo tópico Novo tópico

PROBLEMAS COM POST CONSUMINDO WEB API

ASP.NET

 Compartilhe  Compartilhe  Compartilhe
#492127 - 08/01/2020 13:23:30

PERCIFILHO
MATAO [SP]
Cadast. em:Dezembro/2009


Boa tarde a todos!
Vou tentar resumir e ser o mais claro possível para explicar o meu problema:
Tenho uma WebApi de catálogo de CDs, onde cadastro artistas e os álbuns(cds) dos mesmos e consigo retornar os dados com o GET normalmente.

Estou consumindo essa API com uma aplicação ASP.NET MVC.
Então eu tenho a página Index onde mostra todos os artistas cadastrados e um botão que mostra todos os álbuns desse artista. Por exemplo:

Artista                               Botões
Iron Maiden      -   Editar | Deletar | Discografia

Quando clico no link da Discografia, abre a página mostrando todos os álbuns desse artista e um botão para adicionar álbum.
No botão para adicionar o álbum, tenho a Url.Action que retorna o id do artista:

@Url.Action("Index", "Albuns", new { idArtista = item.ArtistaId })


Aí, no método GET eu tenho então:

       public async Task<IActionResult> Index(int idArtista)
        {
            List<Album> albuns = new List<Album>();
            
            HttpResponseMessage resposta = await client.GetAsync("albums/artista/" + idArtista);
            if (resposta.IsSuccessStatusCode)
            {
                var result = resposta.Content.ReadAsStringAsync().Result;
                albuns = JsonConvert.DeserializeObject<List<Album>>(result);
                ViewBag.idArtista = idArtista;
            }
            return View(albuns);
        }


Até aqui funciona bem;

Agora (finalmente) vem a questão:
Quando clico no botão para adicionar um álbum, eu recebo uma página onde digito os dados. Digito tudo normalmente e quando clico no botão Salvar, ele até salva o álbum, só que ele cria um novo id do artista e grava esta álbum para essa artista novo.
Os métodos Create estáo assim:

       public ActionResult Create(int id_Artista)
        {
            return View();
        }

        // POST: Albuns/Create
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create(Album album)
        {
            var postTask = client.PostAsJsonAsync<Album>("albums", album);
            postTask.Wait();
            var result = postTask.Result;
            if (result.IsSuccessStatusCode)
            {
                return RedirectToAction("Index", "Albuns")
            }
            return View();
        }


Não sei onde estou errando, peço que tenham paciência comigo pois estou há horas tentando solucionar, mas tem algum detalhe que eu ainda não "peguei".
E se tiver algum código que possa ser melhorado, estou aberto a sugestões.
À propósito, o método POST da Web API é esse:

       [HttpPost]
        public async Task<IActionResult> PostAlbum(Album album)
        {
            _context.Albums.Add(album);
            await _context.SaveChangesAsync();
            return Ok();
        }


Agradeço qualquer ajuda.

____________________________________________________
Você sabe que alguém te ama não pelo que ele fala, mas pelo o que faz.
O amor não sobrevive de teorias.




#492129 - 08/01/2020 14:02:10

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Suponho que "Artista" é subordinado à álbum. Se você não mandar o id correto do álbum, o comportamento padrão é exatamente o que você está tendo: Criar um novo. Então verifique:
- Se tem algum artista preenchido na tela
- Se no objeto que está enviando, o artista está com o Id correto
- Se você está adicionando no objeto de envio o artista correto


_______________________________________________________________________
Virei Oráculo!
The end is nigh, be ready for the nukes!


#492131 - 08/01/2020 15:26:29

PERCIFILHO
MATAO [SP]
Cadast. em:Dezembro/2009


Bom Kerplunk, estou fazendo assim:

na pagina dos artistas, no link discografia: (passa por parâmetro o id do artista)
@Url.Action("Index", "Albuns", new { id_Artista = item.ArtistaId })


assim me mostra todos os álbuns do artista.

no botão para adicionar um álbum do artista selecionado:
@Html.ActionLink("Adicionar Album", "Create", "Albuns", new { id_Artista = @ViewBag.id_Artista }, new { @class = "btn" })

A Action Create está assim:
      // GET: Albuns/Create
        public ActionResult Create(int id_Artista)
        {
            ViewBag.id_Artista = id_Artista;
            return View();
        }


Na View Create, criei um input para mostrar o id do artista e tem o botão para salvar o álbum:
<form asp-action="Create">
    <input asp-for="ArtistaId" value="@ViewBag.id_Artista" class="form-control" />
    <input type="submit" value="Salvar" class="btn" />
    </form>


aí, clicando no botão Salvar vai chamar a ActionResult:
        // POST: Albuns/Create
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create(Album album)
        {
            var postTask = client.PostAsJsonAsync<Album>("albums", album);
            postTask.Wait();
            var result = postTask.Result;
            if (result.IsSuccessStatusCode)
            {
                return RedirectToAction("Index", "Albuns", new { id_Artista = album.ArtistaId });
            }
            return View();
        }


Fiz toda a operação debugando e em todos os id_Artista, estavam corretos, com o id do artista que eu selecionei;
Porém, depois de salvar, salvou o álbum, mas com um id de artista diferente (incrementado).

Testei no PostMan, e deu certo, digitei o nome, o ano e o id do artista e gravou certinho. Porém na aplicação é que está o erro, significa que a api está correta.
Não consigo encontrar o meu erro, sei que deve ser um erro besta, mas sinceramente, não estou encontrando.
Se quiser, posso lhe enviar o projeto para analisar (acho que não vai querer, né, rsrsrs).
Veja se entendeu a explicação.

____________________________________________________
Você sabe que alguém te ama não pelo que ele fala, mas pelo o que faz.
O amor não sobrevive de teorias.




#492132 - 08/01/2020 16:31:51

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Não sei como está a estrutura de seus dados, mas suponho que de artista você só precisa do Id(à menos que ano e nome façam parte da chave primária, no caso composta). Se não, só o Id já serviria, os dados ficariam mais ou menos assim:

album: {
    name: "The wall",
    art: "images\pink_floyd_the_wall.jpg",
    releaseDate: "11-30-1979"
    artist: {
        id: 99 //Aqui no caso "99" é o id de "Pink Floyd" no banco
    }
}


Faça uma depuração no server e veja o que está chegando(ou seja, o que a UI está mandando)

_______________________________________________________________________
Virei Oráculo!
The end is nigh, be ready for the nukes!


#492133 - 08/01/2020 18:42:59

PERCIFILHO
MATAO [SP]
Cadast. em:Dezembro/2009


É isso mesmo, tenho a tabela Artista:
ArtistaId - Nome
E a tabela Album:
AlbumId - Nome - Ano - ArtistaId.
No form Create do álbum chega o artistaId certo, só que ao fazer o Post acontece o que eu disse: grava o álbum mas ele grava um artista novo também. Vou rever todos os processos e refazer os métodos pra ver se descubro onde estou errando.
Obrigado por enquanto.

____________________________________________________
Você sabe que alguém te ama não pelo que ele fala, mas pelo o que faz.
O amor não sobrevive de teorias.




#492134 - 08/01/2020 19:26:55

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Honestamente, eu nunca gostei muito do Razor(que é o que você está usando), sempre fiz a UI e Backend bem separada e usando coisas bem distintas. Tenho usado basicamente Angular e React, mas dando uma olhada no Blazor. Mas você está no caminho certo, continue assim!

_______________________________________________________________________
Virei Oráculo!
The end is nigh, be ready for the nukes!


#492135 - 08/01/2020 22:17:30

MRSILVA
MARINGA
Cadast. em:Julho/2015


Olá.

Já aconteceu isso comigo na seguinte situação vou tentar usar o seu contexto para explicar:

O seu modelo de dados Album deve ter uma propriedade ArtistaId, ou seja, o Id do artista, então só passe essa informação para o modelo e a propriedade Artist informe null.

A grosso modo ficaria assim, desde que a propriedade  artistaId esteja carregada com o Id:

  album.Artist = null;
_context.Albums.Add(album);
  await _context.SaveChangesAsync();













#492136 - 09/01/2020 08:42:08

PERCIFILHO
MATAO [SP]
Cadast. em:Dezembro/2009


Acontece que quando a gente fica programando por muito tempo a cabeça já não pensa direito então às vezes dá um nó mente. Mas agora pensando bem, acho que estou errando aqui: tenho que passar o id do artista antes de gravar:
album.ArtistaId = id_Artista;
_context.Albums.Add(album);
            await _context.SaveChangesAsync();
            return Ok();

Não testei ainda, vou testar mais tarde, mas acho que é mais ou menos por aí.
Depois posto se deu certo.

____________________________________________________
Você sabe que alguém te ama não pelo que ele fala, mas pelo o que faz.
O amor não sobrevive de teorias.




#492374 - 28/01/2020 11:59:02

PERCIFILHO
MATAO [SP]
Cadast. em:Dezembro/2009


Fiz umas alterações aqui e agora funcionou.

____________________________________________________
Você sabe que alguém te ama não pelo que ele fala, mas pelo o que faz.
O amor não sobrevive de teorias.




 Tópico anterior Próximo tópico Novo tópico


Tópico encerrado, respostas não sao permitidas
Encerrado por PERCIFILHO em 28/01/2020 11:59:21