5
respostas

Json + Ajax

No asp.net anterior nós tinhamos

$.ajax({
                type: 'POST',
                url: '/pedido/PostQuantidade
                dataType: 'json',
                data: { id: 1, Quantidade: 3}
                   ...
                }

E no controller

   [HttpPost]
        public ActionResult PostQuantidade(int Id, Int Quantidade)
        {
            //logica
            return Json(xpto);
        }

Não precisa usar [DataContract] e [DataMember] me parece "sujar" muito o código usar estas anotações... Existe algum método em simplificar no CORE ? para usar da forma antiga ?

Ou tem algo na forma antiga que seja ruim e por isso mudou ?

5 respostas

Nossa, estou tentando de tudo para não usar aquelas anotações, mas ta dificil...

A quantidade eu até chego.. mas o campo Id não vem...

Olá, José Luiz!

Se não me engano, ao montar o projeto do curso eu tinha tentado fazer sem os atributos DataContract e DataMember (justamente para deixar o modelo mais "limpo", como você bem observou), porém quando o objeto chegava na action do controller ele vinha sem os valores enviados pelo AJAX. Então fiz assim para o Model Binding funcionar implicitamente com o objeto recebido, que é um pouco diferente da forma que você usa no seu exemplo (com os parâmetros da action declarados como tipos primitivos, em vez de um objeto do modelo).

Então o que fiz não foi necessariamente a forma "correta", mas a forma "que deu certo" de acordo com o projeto que estava desenvolvendo. Mas acredito que possa haver uma forma mais elegante que essa.

OK, estou tentado pesquisar mas sem sucesso, mas assim o Campo quantidade vem (sem as anotações), o Campo ID não.. Então, segue 2 possíveis soluções

Pode ler, sei que é ruim... e opinar ?

  1. Crio um campo não mapeado na Classe e uso ele só para transportar o ID

Add na classe ItemPedido.cs

       [NotMapped]
        public int NId { get; set; }

Na View

 var dados = {
                NId: itemId,
                Quantidade: novaQtde,
                PrecoUnitario: 45
            };
            $.ajax({
                url: '/pedido/PostQuantidade',
                type: 'POST',
                contentType: 'application/json',
                data: JSON.stringify(dados)
            })

No Controller


        [HttpPost]
        public void PostQuantidade([FromBody]ItemPedido input)
        {
            //logica
        }

Nesta forma eu cosngui usar sem usar os DataAnotation

ou 2º Crio uma classe ItemPedidoApenasParaPegar.cs somente para usar os dataanootation e não sujar as outras classes

  [DataContract]
    public class ItemPedidoApenasParaPegar
    {
        [DataMember]
        public int Id { get; set; }
        [DataMember]
        public decimal Quantidade { get; set; }

    }

Controller

  [HttpPost]
    public void PostQuantidade([FromBody]ItemPedidoApenasParaPegar input)
        {
            //logica
      // input = 1, Quantidade= 12
// ok
        }

Me recuso a deixar as classes sujas, vou usar esta classe intermediaria e chamar ela de ViewModelJson ... heheh

Depois tento outra solução mais elegante...

Ps.Se as propriedades das classes Produto e ItemPedido chamada Id fosses distintas... não precisaria usar as DatasAnnotations