804 messaggi dal 08 aprile 2009
Ho iniziato a usare la TempData e fino adesso ho fatto in questo modo:

1) Ho una Index della galleria delle opere. Nell'Action se ho impostato il flag nella TempData che sono andata in dettaglio ricarico gli item dalla lista della TempData altrimenti li carico dal DB:

  [HttpGet]
        public async Task<IActionResult> Index(string returnUrl=null)
        {
            var user = await GetCurrentUserAsync();
            if (user == null)
            {
                return View("Error");
            }


            GalleryOpereViewModel viewModel = new();
            if (TempData["indetail"]!=null && TempData["indetail"].ToString() == "1" && TempData["GalleryOpereList"]!=null)
            {
                viewModel= System.Text.Json.JsonSerializer.Deserialize<GalleryOpereViewModel>(TempData["GalleryOpereList"].ToString());
                TempData["GalleryOpereList"] = System.Text.Json.JsonSerializer.Serialize(viewModel);
                TempData.Keep();
            }
            else
            {
                viewModel = getFindGalleryOpere(user, true);
                TempData["GalleryOpereList"] =System.Text.Json.JsonSerializer.Serialize(viewModel);
                TempData.Keep();
            }

            return View(viewModel);

        }


La View all'interno ha un Partial dove carico gli elementi della lista:

<input type="hidden" class="hidden-pagina-next" value="@pageNext" />


@if (Model.Paginazione.TotalRecord == 0)
{
    <p>Nessun risultato</p>
}
else
{
    @foreach (var opera in Model.Opere)
    {
        <div class="item">
            <a asp-controller="Opera" asp-action="Dettaglio" asp-route-idOpera="@opera.IdOpera" asp-route-returnUrl="@Url.Action("Index", "GalleryOpere", new { back = "true" })" class="cursor-pointer">
                <img src="@opera.LinkImmagineCopertina" class="b-radius-top" alt="">

                <div class="g-desc b-radius-bottom p-3">
                    <h4 class="mb-2">@opera.Titolo</h4>
                    <p class="font-size-16 line-height mb-1" style="color:#535f6b"><b>@opera.Autore</b></p>
                    <p class="mb-0" style="color:#535f6b">@opera.Periodo</p>
                </div>
            </a>
        </div>
    }

}


Sempre nella Index in fondo ho un bottone che al click carica un altro blocco:
<div class="row">
    <div class="col-lg-12">
        <div id="next-more-item" style="text-align:center">

            <form asp-action="NextPage" method="get"
                  data-ajax="true"
                  data-ajax-method="get"
                  data-ajax-mode="replace"
                  data-ajax-success="MoreItemSuccess"
                  data-ajax-update="#gallery-temp-moreitem">

                <input type="hidden" id="find-pagina-next" name="pagina" />

                <input class="btn btn-primary" type="submit" value="Mostra altri" />

            </form>



        </div>
    </div>
</div>


L'Action della NextPage ricava gli elementi precedenti e ci accoda quelli letti dal db:
 [HttpGet]
        public async Task<IActionResult> NextPage(int pagina)
        {
            var user = await GetCurrentUserAsync();
            if (user == null)
            {
                return View("Error");
            }

            //devo aggiungere alla lista delle opere la lista precedente
            var viewModelTempData = System.Text.Json.JsonSerializer.Deserialize<GalleryOpereViewModel>(TempData["GalleryOpereList"].ToString());
            var listTotal = viewModelTempData.Opere.ToList();

            GalleryOpereViewModel.COLUMN_ORDER ColumnOrder = (GalleryOpereViewModel.COLUMN_ORDER)Enum.Parse(typeof(GalleryOpereViewModel.COLUMN_ORDER), viewModelTempData.ordercolumn, true);
            GlobalLayer.PAGINAZIONE.ORDER_TYPE OrderType = (GlobalLayer.PAGINAZIONE.ORDER_TYPE)Enum.Parse(typeof(GlobalLayer.PAGINAZIONE.ORDER_TYPE), viewModelTempData.ordertype, true);
            GlobalLayer.PAGINAZIONE.SHOW_ITEMS ShowItems = (GlobalLayer.PAGINAZIONE.SHOW_ITEMS)Enum.Parse(typeof(GlobalLayer.PAGINAZIONE.SHOW_ITEMS), viewModelTempData.showitem, true);


            var viewModel = getFindGalleryOpere(user, false, pagina, ColumnOrder,OrderType,ShowItems);


            listTotal.AddRange(viewModel.Opere);

            viewModel.Opere = listTotal;

            TempData["GalleryOpereList"] = System.Text.Json.JsonSerializer.Serialize(viewModel);
            TempData.Keep();
            return PartialView("_ResultList", viewModel);
        }



Nel js del success sostanzialmente oltre al fare il refresh della gallery masonry aggiorno il valore del campo hidden del NextPage con la pagina successiva.

Nell'Action del dettaglio della Opera se provengo da galleria imposto a 1 il flag indetail che poi salvo sempre sulla TempData.

Nella classe centralizzata dei filter delle action se non sono nel controller della galleria o del dettaglio dell'opera ripulisco la TempData.

Funziona ma devo fare dei test di stress con molti dati e soprattutto non so che impatto può avere la TempData sul server perchè non ho mai utilizzato la session per archiviare liste di dati.
18 messaggi dal 23 marzo 2021
Mi sembra una buona soluzione!
stavo provando a fare qualche test con le session invece che con i tempdata (come ragionamento sul codice che mi hai mostrato mi sembrano molto simili) ma causa giornata impegnativa non sono riuscito a fare una prova sensata da provare a farti vedere per ragionarci su..
non ho mai utilizzato i tempdata quindi non saprei quanto possono influenzare sulle prestazioni.
Fammi sapere come va! è sempre conoscenza in più!
Modificato da Maury07 il 23 aprile 2021 17:13 -
804 messaggi dal 08 aprile 2009
Sto andando avanti e sto pubblicando su Azure in versione gratuita per far fare un pò di test anche agli utenti caricando molti items.

L'unica cosa che non mi piace di questo sistema sono le immagini che effettivamente viene rifatta la richiesta al server e quindi riscaricate tutte le volte.

Mi chiedevo se c'è un modo per farle andare in cache al browser e non fargli effettuare la richiesta.

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.