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.