Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Estou com dúvida no curso de ASP.NET MVC 3: Desenvolvendo para Web, no exercício do capítulo Requisições elegantes com AJAX.

A aplicação não está funcionado. Quando clico em Decrementar Quantidade, nada acontece. No console do Chrome está aparecendo o seguinte erro:

event.returnValue is deprecated. Please use the standard event.preventDefault() instead.

3Uncaught Error: Error calling method on NPObject.

E ao clicar em Decrementar Quantidade aparece:

POST http://localhost:49653/Produto/DecrementaQuantidade 500 (Internal Server Error)

Erro de Servidor no Aplicativo '/'.

The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult DecrementaQuantidade(Int32)' in 'CaelumEstoque.Controllers.ProdutoController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter. Nome do parâmetro: parameters

Segue o código da aplicação:

public ActionResult DecrementaQuantidade(int id)
        {
            ProdutoDao dao = new ProdutoDao();
            Produto produto = dao.BuscaPorId(id);
            if (produto.Quantidade > 0)
            {
                produto.Quantidade--;
                dao.Atualiza(produto);
            }       
            return Json(produto);
        }


@model List<CaelumEstoque.Models.Produto>
<table>
    <thread>
        <tr>
            <th>Id</th>
            <th>Nome do Produto</th>
            <th>Preco</th>
            <th>Quantidade</th>
            <th></th>
        </tr>
    </thread>
    <tbody>
        @foreach (var produto in Model)
        {
            <tr>
                <td>@produto.Id</td>
                <td>@Html.RouteLink(produto.Nome, "VisualizaProdutos", new { id = produto.Id })</td>

                <!--<td>@Html.ActionLink(produto.Nome, "Visualiza", new { id = produto.Id })</td>
                -->
                <td>@produto.Preco</td>
                <td id="quantidade_(@produto.Id)">
                    @produto.Quantidade
                </td>
                <td>
                    <a href="#" onclick="decrementaQuantidade(@produto.Id)"> 
                    Decrementar Quantidade
                    </a>
                </td>
            </tr>
        } 
    </tbody>
</table>

<script type="text/javascript">
    function atualizaQuantidade(produto) {
        var elementoQuantidade = $("#quantidade_" + produto.Id);
        elementoQuantidade.html(produto.Quantidade);
    }

    function decrementaQuantidade(produtoId) {
        var parametros = {
            produtoId : produtoId
        }
        $.post("@Url.Action("DecrementaQuantidade", "Produto")", parametros, atualizaQuantidade);
        return false;
    }


</script>
2 respostas
solução

Olá Bruno

O problema que você está tendo acontece por que o seu código javascript não está enviando o parâmetro id que é utilizado pelo servidor.

Para que ele funcione, o código da função decrementa quantidade precisa enviar um parâmetro chamado id ao invés de produtoId:

function decrementaQuantidade(produtoId){
  var parametros = {
    id : produtoId
  };
  $.post("@Url.Action("DecrementaQuantidade", "Produto")", parametros, atualizaQuantidade);
  return false;
}

Deu certo! Muito obrigado Victor!