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 possvel para explicar o meu problema:
Tenho uma WebApi de catlogo 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 aplicao ASP.NET MVC.
Ento eu tenho a pgina Index onde mostra todos os artistas cadastrados e um boto que mostra todos os lbuns desse artista. Por exemplo:

Artista                               Botes
Iron Maiden      -   Editar | Deletar | Discografia

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

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


A, no mtodo GET eu tenho ento:

       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 questo:
Quando clico no boto para adicionar um lbum, eu recebo uma pgina onde digito os dados. Digito tudo normalmente e quando clico no boto Salvar, ele at salva o lbum, s que ele cria um novo id do artista e grava esta lbum para essa artista novo.
Os mtodos Create esto 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();
        }


No sei onde estou errando, peo que tenham pacincia comigo pois estou h horas tentando solucionar, mas tem algum detalhe que eu ainda no []peguei[].
E se tiver algum cdigo que possa ser melhorado, estou aberto a sugestes.
propsito, o mtodo POST da Web API esse:

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


Agradeo qualquer ajuda.

____________________________________________________
No h nessa vida algo que no se possa alcanar, voc s precisa ir buscar.

#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 no mandar o id correto do lbum, o comportamento padro exatamente o que voc est tendo: Criar um novo. Ento 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 Orculo!
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 parmetro o id do artista)
@Url.Action([]Index[], []Albuns[], new { id_Artista = item.ArtistaId })


assim me mostra todos os lbuns do artista.

no boto 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 boto 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 boto 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 operao debugando e em todos os id_Artista, estavam corretos, com o id do artista que eu selecionei;
Porm, 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. Porm na aplicao que est o erro, significa que a api est correta.
No consigo encontrar o meu erro, sei que deve ser um erro besta, mas sinceramente, no estou encontrando.
Se quiser, posso lhe enviar o projeto para analisar (acho que no vai querer, n, rsrsrs).
Veja se entendeu a explicao.

____________________________________________________
No h nessa vida algo que no se possa alcanar, voc s precisa ir buscar.

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

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


Membro da equipe
No sei como est a estrutura de seus dados, mas suponho que de artista voc s precisa do Id( menos que ano e nome faam parte da chave primria, no caso composta). Se no, 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
    }
}


Faa uma depurao no server e veja o que est chegando(ou seja, o que a UI est mandando)

_______________________________________________________________________
Virei Orculo!
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 tambm. Vou rever todos os processos e refazer os mtodos pra ver se descubro onde estou errando.
Obrigado por enquanto.

____________________________________________________
No h nessa vida algo que no se possa alcanar, voc s precisa ir buscar.

#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 Orculo!
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 situao 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, ento s passe essa informao 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 cabea j no pensa direito ento 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();

No testei ainda, vou testar mais tarde, mas acho que mais ou menos por a.
Depois posto se deu certo.

____________________________________________________
No h nessa vida algo que no se possa alcanar, voc s precisa ir buscar.

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

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


Fiz umas alteraes aqui e agora funcionou.

____________________________________________________
No h nessa vida algo que no se possa alcanar, voc s precisa ir buscar.

 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