Slow AJAX Problems in ASP .NET MVC C #

2

I'm having a slow response problem from my AJAX. I use the following code to search and return a list of results:

Javascript

function enviaBusca(url) {
    var resultado = $('#resultados'),
        mensagem = $('#mensagem'),
        palavras = $('input[type=hidden][name=palavrasTemp]').val(),
        palavraChave = $('#txt_palavra_chave').val(),
        valorMinimo = $('input[type=number][name=valor_minimo]').val(),
        valorMaximo = $('input[type=number][name=valor_maximo]').val(),
        buscaPublicado = $('')
    param = { 'buscaTermo': encodeURIComponent(palavraChave), 'palavrasBuscadas': palavras, 'buscaTipoImovel': get_lista_tipos_marcados(), 'buscaEstado': get_lista_estados_marcados(), 'buscaCidade': get_lista_cidades_marcadas(), 'buscaBairro': get_lista_bairros_marcados(), 'buscaCaptador': get_lista_captadores_marcados(), 'buscaPretensao': get_lista_pretensoes_marcadas(), 'buscaFinalidade': get_lista_finalidades_marcadas(), 'buscaSituacao': get_lista_situacoes_marcadas(), 'buscaValorMinimo': valorMinimo, 'buscaValorMaximo': valorMaximo, 'buscaPublicado': get_lista_publicados_marcadas() };

    $('#loading').removeClass('invisivel');
    resultado.empty();
    mensagem.addClass('invisivel');

    $.post(url, add_anti_forgery_token(param), function (response) {
        if (response) {
            if (response.length > 0) {
                resultado.removeClass('invisivel');
                for (var i = 0; i < response.length; i++) {
                    resultado.html(response);
                }
            }
        } else {
            resultado.addClass('invisivel');
            mensagem.html('Nenhum resultado foi encontrado com os filtros selecionados.').removeClass('invisivel');
        }
        $('#loading').addClass('invisivel');
    });
}

Controller

[AllowAnonymous]
        [HttpPost]
        public ActionResult Resultados(string buscaTermo, string palavrasBuscadas, List<int> buscaTipoImovel, List<int> buscaEstado, List<int> buscaCidade, List<int> buscaBairro, List<int> buscaCaptador, List<int> buscaPretensao, List<int> buscaFinalidade, List<int> buscaSituacao, int buscaValorMinimo, int buscaValorMaximo, List<int> buscaPublicado)
         {
            var palavrasTemp = palavrasBuscadas;
            if (palavrasTemp != "")
            {
                palavrasChave.Add(palavrasTemp);
            }
            palavrasChave.Add(buscaTermo);

            if (!Request.IsAuthenticated)
            {
                buscaSituacao.Clear();
                buscaSituacao.Add(1);
                buscaPublicado.Clear();
                buscaPublicado.Add(1);
            }

            var lista = ImoveisModel.RecuperarListaBusca(palavrasChave, buscaTipoImovel, buscaEstado, buscaCidade, buscaBairro, buscaCaptador, buscaPretensao, buscaFinalidade, buscaSituacao, buscaValorMinimo, buscaValorMaximo, buscaPublicado);
            ViewBag.TermoBuscado = palavrasChave;
            ViewBag.ListaImoveis = lista;
            ViewBag.QuantidadeRegistrosEncontrados = lista.Count();
            return PartialView(lista);
        }

JSON submitted

param = { 'buscaTermo': encodeURIComponent(palavraChave), 'palavrasBuscadas': palavras, 'buscaTipoImovel': get_lista_tipos_marcados(), 'buscaEstado': get_lista_estados_marcados(), 'buscaCidade': get_lista_cidades_marcadas(), 'buscaBairro': get_lista_bairros_marcados(), 'buscaCaptador': get_lista_captadores_marcados(), 'buscaPretensao': get_lista_pretensoes_marcadas(), 'buscaFinalidade': get_lista_finalidades_marcadas(), 'buscaSituacao': get_lista_situacoes_marcadas(), 'buscaValorMinimo': valorMinimo, 'buscaValorMaximo': valorMaximo, 'buscaPublicado': get_lista_publicados_marcadas() }

The query runs until fast, the time varies from 20 to 600ms depending on the amount of results obtained but the problem is the AJAX return, it takes a few minutes to mount the screen and hide the div loading ... What can to have it wrong?

    
asked by anonymous 09.11.2018 / 16:48

2 answers

0

After breaking my head trying to find the problem in AJAX I stopped and thought the obvious: what's the return? It is a list, being a list I do not need to go through the "response" object to assemble a list so I decided to remove the for and leaving like this:

Old code

$.post(url, add_anti_forgery_token(param), function (response) {
    if (response) {
        if (response.length > 0) {
            resultado.removeClass('invisivel');
            for (var i = 0; i < response.length; i++) {
                resultado.html(response);
            }
        }
    } else {
        resultado.addClass('invisivel');
        mensagem.html('Nenhum resultado foi encontrado com os filtros selecionados.').removeClass('invisivel');
    }
    $('#loading').addClass('invisivel');
});

New code

$.post(url, add_anti_forgery_token(param), function (response) {
    if (response.length > 0) {
        resultado.removeClass('invisivel');
        resultado.html(response);
    } else {
        resultado.addClass('invisivel');
        mensagem.html('Nenhum resultado foi encontrado com os filtros selecionados.').removeClass('invisivel');
    }
    $('#loading').addClass('invisivel');
});

Thanks to everyone for the answers and I leave here the solution so that if someone else has similar problems can solve.

    
12.11.2018 / 18:24
3

From what I'm seeing the query does not return you just a JSON, but all HTML already properly formatted. When you said the query was quick, does that include HTML formatting, or just the query in the database?

Formatting strings in the wrong way can be very costly. Strings are usually immutable, meaning that when concatenating 2 strings, the compiler needs to reallocate all of the variable's memory.

In C #, the correct way to build long strings, is with the StringBuilder object.

If you are already doing this on your server, and the slowness is all of JavaScript, there is not much to do, I recommend you replace

for (var i = 0; i < response.length; i++) {
    resultado.html(response);
}

by

resultado.html(response.join(''));
    
09.11.2018 / 17:21