Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

UpdateQuantidade() no PedidoController não recebe a quantidade

Já ajustei a classe ItemPedido para usar os atributos [DataContract}] e [DataMember], mas não funcionou. Verifiquei a chamada ajax e o código tá certo. A única coisa diferente que vejo é o fato de estar usando .Net Core 5. Mas não achei nenhum problema em relação a isso sendo comentado na internet.

Ajax

@section Scripts{
    <script type="text/javascript">
        function ClickIncremento(btn) {
            var linhaDoItem = $(btn).parents('[item-id]');
            var itemId = $(linhaDoItem).attr('item-id');
            var novaQtde = $(linhaDoItem).find('input').val();

            var data = {
                Id: itemId,
                Qtde: novaQtde
            }

            $.ajax({
                url: "/Pedido/Updatequantidade",
                type: "POST",
                contentType: "application/json",
                dataType: "json",
                data: JSON.stringify(data)
            });

            debugger;
        }

        function ClickDecremento(btn) {

        }
    </script>

ItemPedido

[DataContract]
    public class ItemPedido : BaseModel
    {
        public ItemPedido()
        {
        }

        public ItemPedido(Pedido pedido, Produto produto, int quantidade, decimal precoUnitario)
        {
            Pedido = pedido;
            Produto = produto;
            Quantidade = quantidade;
            PrecoUnitario = precoUnitario;
        }

        [Required]
        [DataMember]
        public Pedido Pedido { get; private set; }

        [Required]
        [DataMember]
        public Produto Produto { get; private set; }

        [Required]
        [DataMember]
        public int Quantidade { get; private set; }

        [Required]
        [DataMember]
        public decimal PrecoUnitario { get; private set; }

        [DataMember]
        public decimal Subtotal => Quantidade * PrecoUnitario;
    }

Startup

using System;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.EntityFrameworkCore;
using Microsoft.AspNetCore.Mvc.NewtonsoftJson;
using Loja.Data;
using Loja.Repositories;
using Microsoft.AspNetCore.Http;

namespace Loja
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllersWithViews();
            services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
            services.AddDistributedMemoryCache();
            services.AddSession();
            services.AddDbContext<ApplicationContext>(options =>
                options.UseSqlServer(Configuration.GetConnectionString("Default")));

            services.AddTransient<IDataService, DataService>();
            services.AddTransient<IProdutoRepository, ProdutoRepository>();
            services.AddTransient<IPedidoRepository, PedidoRepository>();
            services.AddTransient<IItemPedidoRepository, ItemPedidoRepository>();
            services.AddTransient<ICadastroRepository, CadastroRepository>();
            services.AddControllersWithViews().AddNewtonsoftJson();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env,
            IServiceProvider serviceProvider)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }
            app.UseHttpsRedirection();
            app.UseStaticFiles();
            app.UseSession();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Pedido}/{action=Carrossel}/{Codigo?}");
            });

            serviceProvider.GetService<IDataService>().InicializaDb();
        }
    }
}

PedidoController

[HttpPost]
        public void UpdateQuantidade([FromBody]ItemPedido itemPedido)
        {
        }
2 respostas

Vi a sugestão num dos posts dessa aula sobre ajustar a Startup para usar a biblioteca NewtonsoftJson, registrar o serviço

services.AddControllersWithViews().AddNewtonsoftJson();

e adicionar

dataType: "json" 

na chamada Ajax. Mas isso também não resolveu. O "id" chega normalmente no Controller, mas a quantidade não.

solução!

Descobri que o problema era o nome da propriedade na montagem do objeto para ser enviado na chamada AJAX. Tava usando "Qtde" ao invés de "Quantidade". Só isso. Entendi que os nomes precisam ser os mesmos do modelo.