MVC - FALHA AO ATUALIZAR REGISTRO COM WEBAPI

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

MVC - FALHA AO ATUALIZAR REGISTRO COM WEBAPI

ASP.NET

 Compartilhe  Compartilhe  Compartilhe
#485496 - 20/11/2018 12:29:48

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


Boa tarde, pessoal!
Peguei um exemplo do Macoratti para consumir uma Web Api com Windows Forms e funcionou direitinho, agora estou adaptando o projeto para consumir a WebApi em um projeto MVC.
Consigo fazer listar os produtos na view Index e incluir um produto na view Create.
Porém agora estou tentando atualizar um produto na view Edit, só que ao invés de alterar os dados do produto, ele está inserindo um produto novo.
Onde será que estou errando? O código é esse:


        // POST: Produtos/Edit/5
        [HttpPost]
        public async Task<ActionResult> Edit([Bind(Include = "Id, Nome, Categoria, Preco")] Produto produto)
        {
            if (ModelState.IsValid)
            {
                using (var client = new HttpClient())
                {
                    var serializedProduto = JsonConvert.SerializeObject(produto);

                    var content = new StringContent(serializedProduto, Encoding.UTF8, "application/json");

                    var result = await client.PostAsync(URI, content);

                    return RedirectToAction("Index");
                }
            }
            return View(produto);
        }


____________________________________________________
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.




#485497 - 20/11/2018 13:17:49

MRSILVA
MARINGA
Cadast. em:Julho/2015


Olá.

Para alterar tem que ser o método PUT



#485498 - 20/11/2018 13:27:37

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


Fiz uma alteração aqui, adaptando de um outro exemplo que encontrei na net:

        [HttpPost, ActionName("Edit")]
        public ActionResult Edit(Produto produto)
        {
            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri(URI);

                var putTask = client.PutAsJsonAsync<Produto>("produtos", produto);
                putTask.Wait();

                var result = putTask.Result;
                if (result.IsSuccessStatusCode)
                {
                    return RedirectToAction("Index");
                }
            }
            return View(produto);
        }


Continua não alterando o registro.
Debugando o projeto, nesta linha:
var result = putTask.Result;
está retornando o erro 405 -> Method Not Allowed (Método não permitido)
Como corrigir isso?


____________________________________________________
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.




Resposta escolhida #485499 - 20/11/2018 13:38:54

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


Membro da equipe
Amigo, acho que novamente, seu problema é conceito...

O que você está postando é o código que está na API, certo?

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


#485501 - 20/11/2018 15:44:01

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


Então, Kerp, talvez eu esteja ainda meio "atrapalhado", mas juro que estou tentando. Pego um exemplo aqui, outro ali, estudo e tento colocar em prática, mas às vezes dá "zebra".
Esse código que eu postei é o do MVC.

Na Web Api, eu tenho uma interface:
public interface IProdutoRepositorio
    {
        IEnumerable<Produto> GetAll();
        Produto Get(int id);
        Produto Add(Produto item);
        void Remove(int id);
        bool Update(Produto item);
    }


Tenho uma classe de produto:

    public class Produto
    {
        public int Id { get; set; }
        public string Nome { get; set; }
        public string Categoria { get; set; }
        public decimal Preco { get; set; }
    }


Tenho uma classe do repositório do produto:

    public class ProdutoRepositorio : IProdutoRepositorio
    {
        private List<Produto> produtos = new List<Produto>();

        private int _nextId = 1;

        public ProdutoRepositorio()
        {
            Add(new Produto { Nome = "Guaraná Antarctica", Categoria = "Refrigerantes", Preco = 4.59M });
            Add(new Produto { Nome = "Suco de Laranja Prats", Categoria = "Sucos", Preco = 5.75M });
            Add(new Produto { Nome = "Mostarda Hammer", Categoria = "Condimentos", Preco = 3.90M });
            Add(new Produto { Nome = "Molho de Tomate Cepera", Categoria = "Condimentos", Preco = 2.99M });
            Add(new Produto { Nome = "Suco de Uva Aurora", Categoria = "Sucos", Preco = 6.50M });
            Add(new Produto { Nome = "Pepsi-Cola", Categoria = "Refrigerantes", Preco = 4.25M });
        }

        public Produto Add(Produto item)
        {
            if (item == null)
            {
                throw new ArgumentNullException("item");
            }

            item.Id = _nextId ++;

            produtos.Add(item);

            return item;
        }

        public Produto Get(int id)
        {
            return produtos.Find(p => p.Id == id);
        }

        public IEnumerable<Produto> GetAll()
        {
            return produtos;
        }

        public void Remove (int id)
        {
            produtos.RemoveAll(p => p.Id == id);
        }

        public bool Update(Produto item)
        {
            if (item == null)
            {
                throw new ArgumentNullException("item");
            }

            int index = produtos.FindIndex(p => p.Id == item.Id);

            if (index == -1)
            {
                return false;
            }

            produtos.RemoveAt(index);
            produtos.Add(item);
            return true;
        }
    }


E tenho o controller de produto:
public class ProdutosController : ApiController
    {
        static readonly IProdutoRepositorio repositorio = new ProdutoRepositorio();

        public IEnumerable<Produto> GetAllProdutos()
        {
            return repositorio.GetAll();
        }

        public Produto GetProduto(int id)
        {
            Produto item = repositorio.Get(id);

            if (item == null)
            {
                throw new HttpResponseException(HttpStatusCode.NotFound);
            }

            return item;
        }

        public IEnumerable<Produto> GetProdutosPorCategoria(string categoria)
        {
            return repositorio.GetAll().Where(p => string.Equals(p.Categoria, categoria, StringComparison.OrdinalIgnoreCase));
        }

        public HttpResponseMessage PostProduto(Produto item)
        {
            item = repositorio.Add(item);

            var response = Request.CreateResponse<Produto>(HttpStatusCode.Created, item);

            string uri = Url.Link("DefaultApi", new { id = item.Id });

            response.Headers.Location = new Uri(uri);

            return response;
        }

        public void PutProduto(int id, Produto produto)
        {
            produto.Id = id;

            if (!repositorio.Update(produto))
            {
                throw new HttpResponseException(HttpStatusCode.NotFound);
            }
        }

        public void DeleteProduto(int id)
        {
            Produto item = repositorio.Get(id);

            if (item == null)
            {
                throw new HttpResponseException(HttpStatusCode.NotFound);
            }

            repositorio.Remove(id);
        }
    }




____________________________________________________
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.




#485503 - 20/11/2018 17:06:26

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


Membro da equipe
É na sua controller que vai aqueles "[HttpPost]" e "[HttpPut]", nos métodos respectivos. Seria bom também que os retornos deles fosse ActionResult. São esses métodos que você vai chamar no seu client.

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


#485514 - 22/11/2018 07:34:56

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


Valeu Kerp, bom, eu vou continuar estudando, vou criar um projeto novo do começo e depois eu posto o resultado.
Obrigado por enquanto e até mais.

____________________________________________________
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 22/11/2018 07:35:09