2
respostas

Na classe "UpdateQuantidadeResponse", porque o nome do atributo "CarrinhoViewModel" precisa obrigatoriamente ser "carrinhoViewModel" ?

Repare,

Na classe "UpdateQuantidadeResponse", se deixarmos o código como abaixo (simplificando o atributo "CarrinhoViewModel" e o nomeando como "carrinho", por exemplo), a atualização dos itens para de funcionar.

Quero entender porque não posso simplificar o nome do atributo.

O controller se perde? Há algum ponto de mapeamento que não estou compreendendo?

    public class UpdateQuantidadeResponse
    {
        public UpdateQuantidadeResponse(ItemPedido itemPedido, CarrinhoViewModel carrinhoViewModel)
        {
            this.itemPedido = itemPedido;
            this.carrinho = carrinhoViewModel;
        }

        public ItemPedido itemPedido { get; }
        public CarrinhoViewModel carrinho { get; } // <<< 
    // Se uso "carrinho", a atualização dos itens 
    // e o valor total param de serem atualizados.
    // Porém, se uso "carrinhoViewModel", tudo volta a funcionar!
    // Não consigo entender se o controller se perde ou se outro ponto da App "se perde". 
    }
}

Importante salientar: Eu fiz esse teste tanto com o meu código quanto com o código INTEGRO do instrutor. Você pode baixar o material da aula e alterar o nome da variável e isso já ocasionará o cenário que relato.

Poderiam me ajudar?

2 respostas

João Paulo, tudo bem?

Me parece que o problema não é no código aí colado, mas na chamada desse método. O MVC realmente mapeia as variáveis pelo seu nome. O chamado "Bind". Mudar o nome no Controller e View refletem no resultado da execução.

Se pude ajudar, marque a resposta como solucionada, por avor! Obrigado! Abs

Oi, Murilo!

Obrigado pela ajuda, porém sigo com a mesma dúvida.

A classe "UpdateQuantidadeResponse" é um Model (está dentro de Models). Em determinado momento, ela é instanciada E retornada dentro do método "UpdateQuantidade" da classe de repositório "PedidoRepository":

        public UpdateQuantidadeResponse UpdateQuantidade(ItemPedido itemPedido)
        {
            var itemBanco = itemPedidoRepository.GetItemPedido(itemPedido.Id);
            if (itemBanco != null)
            {
                itemBanco.setQuantidade(itemPedido.Quantidade);
                if(itemPedido.Quantidade == 0)
                {
                    itemPedidoRepository.RemoveItemPedido(itemPedido.Id);
                }
                contexto.SaveChanges();

                var carrinhoViewModel = new CarrinhoViewModel(GetPedido().Itens);
                return new UpdateQuantidadeResponse(itemBanco, carrinhoViewModel);
            }

            throw new ArgumentException("ItemPedido Não encontrado");
        }

Fazendo o 'trace' das referências, sua invocação mais alta ocorre no controller "PedidoController", onde temos o trecho de código abaixo (e inclusive há o bind que você menciona):

        [HttpPost]
        public UpdateQuantidadeResponse UpdateQuantidade([FromBody]ItemPedido itemPedido)
        {
           return pedidoRepository.UpdateQuantidade(itemPedido);
        }

Contudo, uma vez que os tipos/valores transportados estão sendo respeitados, eu não consegui entender precisamente onde o MVC "se perde".

Alterando a variável do atributo CarrinhoViewModel da classe "UpdateQuantidadeResponse" para "carrinho" (exemplo), vejo na console do Chrome um erro acontecendo no acesso aos "itens" quando seto a quantidade de um produto para 0.

O trecho abaixo é a linha do arquivo "carrinho.js", onde a chamada para itens falha (quando a variavel não é "carrinhoViewModel", como o nome da classe.

$('[numero-itens]').html('Total: ' + carrinhoViewModel.itens.length + ' itens');

Gostaria muito de entender o que ocorre. Já tentei debugar a aplicação, mas não obtive sucesso.

Alguém consegue dar uma luz?