Problem deleting a record, fetch the next one

-1

I'm trying to do in the code, a page edit, then the user on this edit page, it can delete the record, and if it delete, the system has to check, if there is a next record, it goes to edit screen next, if the next id does not exist, it tries the previous record, and if it has neither the next nor the previous one, it returns to the page to include a new one. It follows the logic I'm doing, but it does not always work.

[HttpPost]
    public ActionResult ExcluirProduto(int id)
    {
        var result = false;
        var item = db.Produtos.Find(id);

        if (item != null)
        {
            db.Produtos.Remove(item);
            db.SaveChanges();

            result = true;
        }
        var itemProx = db.Produtos.Where(e => e.Id >= id).OrderBy(e => e.Id).Skip(1).Take(1).FirstOrDefault();
        var itemAnte = db.Produtos.Where(e => e.Id <= id).OrderByDescending(e => e.Id).Skip(1).Take(1).FirstOrDefault();
        int idprox = 0;
        int idant = 0;
        try
        {
            idprox = itemProx.Id;
        }
        catch { idprox = 0; }
        try
        {
            idant = itemAnte.Id;
        }
        catch { idant = 0; }
        try
        {
            if (idprox == 0 && idant == 0)
            {
                id = 0;
            }
            else
            {
                if (idprox != 0)
                {
                    id = (itemProx.Id);

                }
                else
                {
                    id = (itemAnte.Id);
                }
            }
            return Json(new { Resultado = result, id });
        }
        catch {
            id = 0;
            return Json(new { Resultado = result, id });
        }
    }

And here is my AJAX that redirects the page:

 function Excluir(idproduto) {
    var idproduto = document.getElementById("Id").value;
    var url = "/Produto/ExcluirProduto";
    $.ajax({
        url: url,
        data: { id: idproduto },
        datatype: "json",
        type: "POST",
        success: function (data) {
            if (data.resultado) {
                alert('Excluído com sucesso.');
                if (data.id != 0) {
                    window.location.href = "/Produto/Editar/" + (data.id);
                }
                else {
                    window.location.href = "/Produto/Novo";
                }
            }
        }
    })
}

Remembering that I use MVC Core - Page Razor.

    
asked by anonymous 09.08.2018 / 13:58

2 answers

1

Your selection logic is a little confusing on your Controller and can be simplified. And I've changed your Json return object to ensure that it displays the property and value format and respects the case.

[HttpPost]
public ActionResult ExcluirProduto(int id)
{   
    var result = false;
    var item = db.Produtos.Find(id);

    if (item != null)
    {
        db.Produtos.Remove(item);
        db.SaveChanges();

        result = true;
    }
    //Seleciona o próximo maior
    int? proximoProdutoId = db.Produtos.Select(p => p.Id)
                                        .OrderBy(p => p)
                                        .FirstOrDefault(p => p > id);

    //Se for 0, tenta selecionar o próximo menor
    if(proximoProdutoId == 0)
        proximoProdutoId = db.Produtos.Select(p => p.Id)
                                      .OrderByDescending(p => p)
                                      .FirstOrDefault(p => p < id);


    return Json(new { resultado = result, id = proximoProduto});
}

With these settings your javascript should behave the correct way, but it's worth noting that as you wrote, if the input id does not exist in the context to be deleted, resultado will false and nothing will happen on the page.

    
09.08.2018 / 15:25
0

I see two errors to fix in your logic:

  • You do not need to use ".Skip (1) .Take (1)" because the FirstOrDefault command preceded by OrderBy / OrderByDescending already resolves the next or previous catch.
  • In your Ajax call, if your result date is 'false', your application will not do anything.
  • You did not clarify the real problem, but maybe it has to do with these two situations.

        
    09.08.2018 / 14:10