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

Não chama a função Atualiza do JQuery

Tentei de tudo e mesmo analisando as respostas e tentando de todas as formas eu não consegui fazer atualizar com a função Atualiza do javascript ensinada em aula, o erro que aparece é:

POST http://localhost:49188/Produtos/Decrementa 500 (Internal Server Error)

Abrindo o Erro Aparece:

O dicionário de parâmetros contém uma entrada nula para o parâmetro 'id' de tipo que não permite valor anulável 'System.Int32' para o método 'System.Web.Mvc.ActionResult Decrementa(Int32)' em 'Controle_De_Estoque.Controllers.ProdutosController'. Um parâmetro opcional deve ser um tipo de referência, um tipo que permite valor anulável ou declarado como opcional.

Por favor me ajudem.

Código Da Index dos Produtos:

<script src="~/Scripts/jquery-3.3.1.min.js"></script>
<script>
    function Decrementa(produtoID){
        var url = "@Url.Action("Decrementa", "Produtos")";
        $.post(url, { id: produtoID }, Atualiza);
    }
    function Atualiza(resposta) {        
        $("#coluna_quantidade" + resposta.idproduto).html(resposta.quantidade);
    }
</script>
@model IList<Controle_De_Estoque.produto>
<table class="table table-hover table-responsive">
    <thead>
        <tr>
            <th scope="col">Código</th>
            <th scope="col">Nome</th>
            <th scope="col">Preço</th>
            <th scope="col">Quantidade</th>
            <th scope="col">Ações</th>
        </tr>
    </thead>
    <tbody>
        @foreach (var Produto in Model)
        {
        <tr>
            <td>@Produto.idproduto</td>
            <td>@Produto.nome</td>
            <td>@Produto.preco</td>
            <td id="coluna_quantidade@(Produto.quantidade)">@Produto.quantidade</td>            
            <td>
                <a href="#" onclick="Decrementa(@Produto.idproduto)">Menos</a>
            </td>
        </tr>
        }
    </tbody>
</table>

Código do Controller:

public ActionResult Decrementa(int id)
        {
            ProdutoDAO dao = new ProdutoDAO();
            produto Produto = dao.BuscaPorID(id);
            Produto.quantidade--;
            dao.Atualiza(Produto);
            return Json(Produto);
        }

Código do DAO:

    public produto BuscaPorID(int id)
        {
            using (var context = new EstoqueEntityDB())
            {
                return context.produtoes.Include("categoriaproduto").Where(p => p.idproduto == id).FirstOrDefault();
            }
        }

        public void Atualiza(produto Produto)
        {
            using (var context = new EstoqueEntityDB()) {
                context.Entry(Produto).State = System.Data.Entity.EntityState.Modified;
                context.SaveChanges();
            }
        }
4 respostas

No seu objeto Produto tem algum id vazio cara. Corrigi isso aí se não não compila mesmo.

Desculpe a ignorância, mas comecei a aprender agora, onde ele pega um id vazio?

Roda seu programa em modo debug e vai acompanhando pra ver onde ele pega id vazio. Só olhando nao consegui perceber. Só sei que é isso por causa do erro.

solução!

Resolvi a um tempinho já galera, o problema é que estava na forma que estruturei as models, estou usando mysql e gerei de form automática as classes model, ai em um dado momento estava gerando um erro de referencia circular, só foi preciso fazer uma classe ViewModel que se resolveu o problema.