2 messaggi dal 18 aprile 2020
Salve a tutti.
Da qualche settimana sto approcciando al linguaggio seguendo un corso online. Per fare pratica ho pensato di realizzare una semplice piattaforma web di consultazione dei comuni italiani, delle province e delle regioni. Però sto avendo un problema che vorrei sottoporvi.
Ho creato un controller di nome ComuniController all'interno del quale ho definito tre action:
  • Index() - si occupa di passare alla View una lista di ViewModel contenente l'elenco di tutti i comuni da visualizzare in varie pagine a blocchi di 20;
  • Dettaglio(string id) - si occupa di selezionare un sigolo comune tramite il suo id e passare il ViewModel alla corrispondente View per la visualizzarne il contenuto;
  • Infine ho creato una terza action che ha lo stesso funzionamento della Index() con la sola differenza che quest'ultima effettua una selezione dei comuni appartenenti ad una stessa provincia che passo come parametro, perciò ho pensato di creare un overloading della Index() tramite la direttiva ActionName, facendo condividere la stessa View ad entrambe le action considerato che l'output è assolutamente identico per entrambe.


Ecco il codice:

public async Task<IActionResult> Index()
{
    // RESTITUISCE L'ELENCO DI TUTTI I COMUNI
    List<ComuneViewModel> comuni = await comuneService.GetComuniAsync();
    return View(comuni);
}

public async Task<IActionResult> Dettaglio(string id)
{
    // RESTITUISCE UN SOLO COMUNE CON CODICE id
    ComuneViewModel comune = await comuneService.GetComuneAsync(id);
    return View(comune);
}

// QUI HO CREATO L'OVERLOADING DI Index() TRAMITE LA ActionName ByProvincia
[ActionName("ByProvincia")]
public IActionResult Index(string id)
{
    // RESTITUISCE L'ELENCO DEI COMUNI APPARTENENTI ALLA PROVINCIA CON CODICE id
    List<ComuneViewModel> comuni = await comuneService.GetComuniByProvinciaAsync(id);
    return View(comuni);
}


Così come ho implementato l'overloading, non riesco a far condividere la stessa View Index alle due action Index, ma viene generato un errore a run-time quando invoco l'overloading della Index(string id) poiché essa va a cercare la sua specifica View. Di seguito l'errore restituito:

An unhandled exception occurred while processing the request.
InvalidOperationException: The view 'ByProvincia' was not found. The following locations were searched:
/Views/Comuni/ByProvincia.cshtml
/Views/Shared/ByProvincia.cshtml


Ovviamente potrei risolvere il problema andando a scrivere la corrispondente View ByProvincia, ma ciò non sarebbe una buona pratica dal momento che quest'ultima View avrebbe tutto il codice identico alla View di Index().
Spero di aver ben spiegato il problema e ringrazio anticipatamente chi vorrà aiutarmi a risolvere l'arcano.

Grazie, Vincenzo Camporeale
Modificato da Kampus il 18 aprile 2020 12:39 -
710 messaggi dal 13 novembre 2008
Contributi
Ciao, il dettaglio dell'errore è significativo, se inserisci l'attributo [ActionName] il motore di routing cerca la view corrispondente indicata appunto in ActionName che non trova... Secondo me è corretto fare una action separata, hai parametro e richiesta differenti, una parte della View o tutta saranno uguali, ma puoi risolvere con una PartialView, quindi
Public async Task<IActionResult> ByProvincia(string id)
Con la sua View
poi una PartialView che sarà inserita sia in questa View sia in Index e che rappresenterà i dati con modello comune.
Oppure lascia una sola action Index con parametro facoltativo, se c'è parametro fai partire la richiesta per provincia altrimenti l'altra richiesta, a questo punto gestisce la risposta con solo la view di Index
Modificato da teo prome il 18 aprile 2020 21:05 -
2 messaggi dal 18 aprile 2020
Grazie Teo della risposta. Come da tuo consiglio ho usato una sola Index con parametro facoltativo ed una sola View. Credo che per il mio caso sia la soluzione migliore.
Grazie, Vincenzo.

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.