944 messaggi dal 11 febbraio 2013
ciao
ho un metodo web che ritorna uno stringbuilder e mi chiedo se le prestazioni possano aumentare
ritornando Json...

public static string LoadProduct(int Skip, int Take, string Line)
    {
      
        StringBuilder GetProduct = new StringBuilder();

       Entities db = new Entities();
        var prod = (from ...
                    where a.linea == Line
                    orderby a.cod_numerico descending
                    select a).Skip(Skip)
                             .Take(Take);

        foreach (var a in prod)
        {
            var Codart = a.Codart;
            var pathimg = a.pathimg;

            GetProduct.AppendFormat("<div id='{0}' class=\"col-md-4 js-div\">", ranCodart);
            
    ecc...
    


Se sostituissi con Json il lavoro che fa lo stringbuilder lo farei nella chiamata ajax
$.each(....ecc

Ne vale la pena ?
grazie come sempre
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,


Ne vale la pena ?

Certo, non si mischia codice lato client con codice lato server altrimenti dovrai ricompilare l'applicazione per banali ritocchi alla struttura o alla presentazione della pagina.
Ritornare json non solo ottimizza il trasferimento dati tra client e server ma ti permette di separare bene le loro responsabilità.


Se sostituissi con Json il lavoro che fa lo stringbuilder lo farei nella chiamata ajax
$.each(....ecc

No, usa un motore di templating. Spendi qualche ora per imparare ad usare Knockoutjs.
Qui ci sono i tutorial interattivi.
http://learn.knockoutjs.com/

ciao,
Moreno

Enjoy learning and just keep making
944 messaggi dal 11 febbraio 2013
Lo farò
Mi sembra di capire che con i data attribute fa il binding...

Non voglio farla semplice&#128518;
Me lo studio

Ok grazie mille
Modificato da jjchuck il 27 febbraio 2018 22.24 -
944 messaggi dal 11 febbraio 2013
Ciao Moreno

Ho provato questo e sembra funzionare

var viewModel =
     {
         ListaArticoli: ko.observableArray([]),
         pendingRequest: ko.observable(false),
         EndOfData: ko.observable(false)
     };
     
    function Load(Skip, Take, Line) {
        if (!viewModel.pendingRequest()) {
            viewModel.pendingRequest(true);
           
            $.ajax({
                url: "/api/articoli",
                contentType: "text/json",
                dataType: "json",
                type: "GET",
                data: { "Skip": Skip, "Take": Take, "Line": Line }

            }).done(function (data) {
                if (data.length !== 0) {
                  
                    $.each(data, function (index) {
                        viewModel.ListaArticoli.push(ToKnockOutObservable(data[index]));
                      
                    });
                    console.log(data);

                  }  else {
                       viewModel.EndOfData(true); 
                }

                viewModel.pendingRequest(false);

            }).fail(function (XMLHttpRequest, textStatus, errorThrown) {
                viewModel.pendingRequest(false);
                alert("Request: " + XMLHttpRequest.toString() + "\n\nStatus: " + textStatus + "\n\nError: " + errorThrown);
            }).always(
               //
            );
        }
    }

    function ToKnockOutObservable(articolo) {
        return {
            Codice: ko.observable(articolo.Codart),
            Path: ko.observable(articolo.pathimg),
            Prezzo: ko.observable(articolo.Prezzo)
        };
    }

     $(document).ready(function () {

         //SELEZIONO LINEA
         $('#opLine').on('change', function () {
             viewModel.ListaArticoli.removeAll();//azzero conta
             viewModel.EndOfData(false);

             Skip = 0;
             Line = $('#opLine option:selected').val();
            
             Load(Skip, Take, Line);
             Skip += 9;
             
         });

        var Skip = 0;
        var Take = 9;
        var Line = $('#opLine option:selected').val();
         
        ko.applyBindings(viewModel);
        Load(Skip, Take, Line);//prima pagina
        Skip += 9;

        //scroll 
        $(window).scroll(function (evt) {
            evt.preventDefault();
            if (($(window).scrollTop() >= $(document).height() - $(window).height())
                 && !viewModel.EndOfData()) {
              
                Load(Skip, Take, Line);
                Skip += 9;
            }
        });
        
     });


Sembra funzionare ma a volte salta la penultima pagina...

cmq volevo chiedere se è consigliabile mettere come proprietà nel viewModel la select che rappresenta la linea e anche i parametri della chiamata alla webapi come skip e take

ciao
Modificato da jjchuck il 01 marzo 2018 18.23 -
Modificato da jjchuck il 01 marzo 2018 18.24 -
11.886 messaggi dal 09 febbraio 2002
Contributi
Ok, come ti stai trovando?


cmq volevo chiedere se è consigliabile mettere come proprietà nel viewModel la select che rappresenta la linea e anche i parametri della chiamata alla webapi come skip e take

Sì, per esempio Skip e Take potrebbero essere anche loro degli observable.
Il codice che hai dentro il Load, mettilo invece in un computed observable che dipenderà da skip, take e line. In questo modo, basterà che una qualsiasi di loro cambi per riscatenare automaticamente la richiesta Ajax di caricamento.

Line lo puoi mettere in binding con delle radio button con lo stesso name, per evitare questo:
var Line = $('#opLine option:selected').val();


ciao,
Moreno

Enjoy learning and just keep making
944 messaggi dal 11 febbraio 2013
Mi sto trovando bene: meno codice e piu leggibile
Piu separazione delle responsabilità

Posso usare le proprieta del model per fare cose in maniera piu semplice
tipo disabilitare lo scroll quando non ci sono piu dati

Mi piace...
944 messaggi dal 11 febbraio 2013
Ciao Moreno

sto provando quello che mi consigli

per ora mi sono bloccato qui

var viewModel =
     {
         ListaArticoli: ko.observableArray([]),
         productLines: ko.observableArray([
                                         { text: "Nome linea", value: "L1" },
                                         { text: "Nome Seconda linea", value: "L2" },
                                         { text: "Nome Terza linea", value: "L3" }
                                        
         ]),      
         selectedLine: ko.observable([this.productLines()[0].value]),
         pendingRequest: ko.observable(false),
         EndOfData: ko.observable(false)
     };

     <select id="opLine" runat="server" 
                           data-bind="options: productLines,
                           optionsText: 'text',
                           optionsValue: 'value',
                           value: selectedLine,
                           //optionsCaption: 'Linea...'">
        </select> 
    


Non ho provato le radio button perchè nella pagina consento anche il download in pdf...

cmq ottengo
this.productLines is not a function
in qualunque modo io provi a impostare la variabile per il valore selezionato

Se non passo niente a selectedLine ottengo 404 e poi se seleziono ottengo sempre i valori della prima linea
nella select...

Volevo passare intanto questo nel viewModel
poi fare i computed value come mi suggerisci per Load

...non capisco cosa sbaglio
944 messaggi dal 11 febbraio 2013
Cosi funziona ma alla faccia del DRY principle...
e soprattutto dei tuoi suggerimenti

<select id="opLine" runat="server"
data-bind="options: productLines,
optionsText: 'text',
value: selectedLine">
</select>


var viewModel =
     {
         ListaArticoli: ko.observableArray([]),
         productLines: ko.observableArray([
                                         { text: "Nome Linea1", value: "L1" },
                                         { text: "Nome Linea2", value: "L2" },
                                         { text: "Nome Linea3", value: "L3" },                                       
         ]),      
         selectedLine: ko.observable(),
         pendingRequest: ko.observable(false),
         EndOfData: ko.observable(false)
     };

function ToKnockOutObservable(articolo) {
    return {
        Codice: ko.observable(articolo.ranCodart),
        Path: ko.observable(articolo.pathimg),
        Prezzo: ko.observable(articolo.ranPrezz3)
    };
}


function Load(Skip, Take, Line) {
    if (!viewModel.pendingRequest()) {
        viewModel.pendingRequest(true);
        
        ajax,,,
}


$(document).ready(function () {
    ko.applyBindings(viewModel);
   
    //SELEZIONO LINEA
    $('#MainContent_opLine').on('change', function () {
        viewModel.ListaArticoli.removeAll();//azzero conta
        viewModel.EndOfData(false);

        Skip = 0;
        Line = viewModel.selectedLine().value;
        Load(Skip, Take, Line);
        Skip += 9;

    });

    var Skip = 0;
    var Take = 9;
    var Line = viewModel.selectedLine().value;
    
    Load(Skip, Take, Line);//prima pagina
    Skip += 9;

    //scroll 
    $(window).scroll(function (evt) {
        evt.preventDefault();
        if (($(window).scrollTop() >= $(document).height() - $(window).height())
             && !viewModel.EndOfData()) {
            
            Load(Skip, Take, Line);
            Skip += 9;
        }
    });

});


Domani riprovo... sono un po lento :)

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.