giovedì 30 aprile 2020

.Net gestire il database Microsoft Access con VB.Net e C#

Si riporta l'articolo scritto per il sito https://www.iprogrammatori.it/articoli/microsoft-net-framework/art_net-la-gestione-del-database-microsoft-access-2016-tramite-vbnet-c_1677.aspx


In questo articolo vedremo come gestire tramite un progetto di tipo “Windows Form” una base dati di 3 tabelle creata con il database Microsoft Access 2016.
Vedremo le operazioni più comuni, quali selezione, inserimento, modifica e cancellazione dei dati, in modo che si ha una panoramica completa su come realizzare applicazioni di tipo “Windows Application” con le funzionalità più comuni.
Nell’articolo saranno affrontati temi legati al database con l’utilizzo dei linguaggi più famosi ed utilizzati, quali Visual Basic Net e C#.
Creazione della base dati
Prima di realizzare il nostro progetto di tipo “Windows Application” si deve creare un database di Access.
Dopo aver aperto Microsoft Access 2016, selezioniamo tra i modelli “Database Vuoto” come mostrato in figura 1.




Figura 1 – La finestra principale

Dopo aver fatto click sul pulsante “Database Vuoto” verrà visualizzata una nuova finestra, il tutto come mostrato in figura 2.




Figura 2 – La finestra per la creazione del database

Impostiamo nella casella del “nome file” il valore “Dati”, mentre come percorso ci posizioniamo nella root del nostra unità, ossia “C:\” quella più comune ed in tale posizione si crea una nuova cartella denominata “Dati”, a questo punto facciamo click sul pulsante “Crea”.
Per impostare il percorso dobbiamo fare click sull’icona della cartella.
Nella finestra che viene aperta (figura 3) verrà visualizzata la possibilità di definire una prima tabella.



Figura 3 – Il database con modalità di creare una prima tabella.

Facciamo click sul pulsante “Visualizza” E poi struttura, verrà visualizzata una casella a video con il quale ci chiede di impostare un nome per la tabella, inseriamo come valore “Ordini”.
A questo punto confermate tramite il pulsante “OK”.
Ci visualizza la struttura della tabella con una colonna già creata denominata “ID” di tipo contatore e chiave (figura 4)
Nella casella di sotto, scriviamo i nostri campi, quello di relazione con le fatture, che chiameremo “Idfattura” e sarà di tipo “Numerico”, un altro campo, denominato “Descrizione” di tipo “Testo breve” con il quale andremo a scrivere la descrizione dei pezzi”.
Altri campi saranno, uno denominato “Quantita” e sarà di tipo “numerico”, un altro campo sarà denominato “Prezzo” e sarà di tipo “Valuta”, un campo denominato “Imponibile” che è il prezzo moltiplicato i pezzi, anch’esso di tipo “Valuta”, un campo “Iva” con il quale si andrà a colare l’importo dell’iva, anch’esso sarà di tipo “Valuta” ed infine un campo denominato “TotaleFattura” di tipo “Valuta”, il tutto come mostrato in figura 4.



Figura 4 – La struttura della tabella ordini.

Salviamo le modiche tramite il pulsante del dischetto situato in alto.
Ora andiamo a creare una tabella denominata “Clienti”, che metteremo in relazione con la tabella fattura.
Per creare una nuova tabella, dal menu di Microsoft Access, cliccare sulla voce “Crea” e poi nel menu che viene aperto “Tabella”.
Anche in questo caso, verrà visualizzata la modalità “Foglio Dati” che invece porteremo in modalità struttura, come visto in precedenza.
Oltre al campo id, dobbiamo creare altri campi in particolare un campo denominato “Denominazione” il quale conterrà il nome dei clienti, di tipo “Testo breve” , un campo denominato indirizzo, anch’esso di tipo “Testo Breve”, un campo denominato “Citta” di tipo “Testo breve” ed infine un campo denominato “Telefono” di tipo “Testo Breve”.
Il tutto sarà come mostrato in figura 5.





Figura 5 – La definizione della tabella Clienti

Ora non resta che creare l’ultima tabella, quella relativa alla fattura che andrà a relazionarsi con le due tabelle create in precedenza.
La tabella fattura, sarà quella che visualizzerà i dati e le informazioni relativi all’acquisto di un determinato prodotto.
Sempre dal menu di Microsoft Access, facciamo click sulla voce “Crea” e selezioniamo la voce “Tabella” tra le varie voci.
Anche in questo caso passiamo in visualizzazione struttura e nella casella che ci chiede il nome della tabella, impostiamo il nome “Fatture”.
Oltre al campo ID di tipo chiave e contatore, che viene imposto automaticamente dal sistema, come avvenuto per le precedenti tabelle, aggiungiamo un nuovo campo denominato “IdOrdini” di tipo “numerico”, un campo denominato “IDClienti” di tipo “Numerico”, un campo denominato “NumeroFattura” di tipo “numerico” nel quale andrà inserito il numero della fattura, un campo denominato “DataFattura” di tipo “Data”, un campo denominato “Consegna” di tipo “Testo breve” ed infine un campo denominato “Note” di tipo “Testo lungo”.
Queste informazioni saranno quelle che raccolgono i dati che verranno visualizzati all’utente che utilizzerà il programma.
La tabella sarà come quella riportata in figura 6.




Figura 6 - La struttura della tabella

Conclusioni

Si conclude in questa prima parte la creazione del programma gestionale per la gestione dei dati tramite il database Microsoft Access, utilizzando la tecnologia .Net in particolare “Windows Application” con il quale vedremo nei prossimi articolo come accedere al database per estrapolare le informazioni, aggiungere, modificare e cancellare i dati.
La struttura di una base dati è una fase molto importante, perché sono le fondamenta di ogni applicativo, realizzarla male o correggerla durante la fase di creazione del programma, comporta tempi più lunghi di realizzo e soprattutto difficoltà nel procedere. Per questo è importante spendere più tempo nella progettazione e creazione della base, perché se il lavoro è ben fatto ci ritroveremo attività di sviluppo semplificato.

mercoledì 29 aprile 2020

Error Entity Framework to SQlite wizard designer

Utilizzando Entity Framework con il database SQlite può verificarsi un problema durante il Wizard in particolare nel momento in cui si devono selezionare le tabelle.
Se l'errore è


Errore durante la connessione al database. È possibile che il database non sia disponibile. Eccezione di tipo 'System.InvalidCastException'. Messaggio di errore: 'Impossibile eseguire il cast di [A]System.Data.SQLite.SQLiteConnection a [B]System.Data.SQLite.SQLiteConnection. Il tipo A ha origine da 'System.Data.SQLite, Version=1.0.112.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139' nel contesto 'Default' nella posizione 'C:\WINDOWS\Microsoft.Net\assembly\GAC_32\System.Data.SQLite\v4.0_1.0.112.0__db937bc2d44ff139\System.Data.SQLite.dll'. Il tipo B ha origine da 'System.Data.SQLite, Version=1.0.112.1, Culture=neutral, PublicKeyToken=db937bc2d44ff139' nel contesto 'LoadNeither' nella posizione 'C:\Users\nomeutente\AppData\Local\Microsoft\VisualStudio\16.0_3a1cb104\ProjectAssemblies\qw4nevj901\System.Data.SQLite.dll'.'.





La causa può essere il mancato riferimento della libreria "EntityFramework" che dovremmo sostituire con quella che abbiamo installato con il pacchetto di SqlLite dal seguente sito https://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki

La soluzione riguarda quella di togliere come riferimento  le dll "System.Data.SQLite" , "System.Data.SQLite.EF6", "System.Data.SQLite.Linq" dal progetto, ed aggiungere il riferimento nel percorso dove abbiamo installato il pacchetto nel mio caso qui "C:\Program Files (x86)\System.Data.SQLite\2015\bin" selezionando come dll "System.Data.SQLite" , "System.Data.SQLite.EF6", "System.Data.SQLite.Linq" , mentre entity  .
Dopo averla aggiunta, compilare il programma e aggiungiamo un nuovo elemento di tipo "Ado.Net Entity Data Model" a questo punto sarà possibile visualizzare le tabelle del database, come nella seguente figura.






martedì 28 aprile 2020

Componente Entity Framework per Sqlite

Dopo aver istallato il componente SQLite/SQL Server Compact Toolbox scaricabile qui https://marketplace.visualstudio.com/items?itemName=ErikEJ.SQLServerCompactSQLiteToolbox dobbiamo installare un componente per gestire il wizard di Entity Framework per il database Sqlite dal sito ufficiale qui https://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki
Nel momento in cui si sta scrivendo, il componente è il seguente "sqlite-netFx46-setup-bundle-x86-2015-1.0.112.0.exe" nella categoria "Setups for 32-bit Windows (.NET Framework 4.6)" , in questo modo possiamo gestire in maniera visuale il database. L'installazione dei file vanno impostati nella GAC quindi nelle opzioni della finestra di installazione selezionare tutte le opzioni.
Per accertarci che abbiamo installatore correttamente il componente, nella toolbox della gestione del database, dobbiamo fare click sull'icona "informazioni" in modo da visualizzare la finestra qui di seguito.


La voce Sqlite EF6 DbProvider in GAC dev'essere impostato su "yes", altrimenti non sarà possibile utilizzare il Wizard.



lunedì 27 aprile 2020

Download SQLite/SQL Server Compact Toolbox componente gratuito per gestire i databse Sqlite e Sql Server Compact




Dal seguente sito https://marketplace.visualstudio.com/items?itemName=ErikEJ.SQLServerCompactSQLiteToolbox  la possibilità di scaricare gratuitamente un componente per la gestione dei database Sqlite e Sql Server Compact .
Per il download e maggiori informazioni visitate il sito indicato.

domenica 26 aprile 2020

Portale sul fai da te e riciclo

Instructables


Il seguente sito https://www.instructables.com/ in lingua inglese, offre una serie di tutorial riguardante il riciclo e del fai da te con tanti esempi reali e soprattutto in vari ambiti.
Nel sito sono presenti numerosi tutorial aggiornato costantemente.
Tramite il box posto in alto destra si possono fare delle ricerche, naturalmente inserendo termini in inglese.

sabato 25 aprile 2020

Download gratuito gioco For The King




Un gioco di strategia scaricabile gratuitamente fino al 30 aprile 2020 quello relativo a For The King.
Un gioco in italiano e per sistema operativo Windows.
Per il download e maggiori informazioni vistate il seguente sito  https://www.epicgames.com/store/it/product/for-the-king/home

venerdì 24 aprile 2020

Asp.Net MVC Core realizzare un menu dinamico a tendina tramite C#

Si riporta l'articolo scritto per il sito https://www.iprogrammatori.it/articoli/microsoft-net-framework/art_aspnet-mvc-core-realizzare-un-menu-dinamico-a-tendina-tramite-c_1680.aspx






In questo articolo vedremo come creare un menu dinamico che permette di visualizzare un menu a tendina, con le voci a scomparsa che richiama le singole pagine "view" il tutto come nella figura precedente.
Il menu che contiene diverse proprietà, permette anche di eseguire codice Javascript, oppure richiamare delle finestre modale.
Naturalmente nell’esempio proposto vedremo come richiamare le varie pagina Asp.Net MVC tramite il nome del controller e della Action.
Inoltre in base al tipo di profilo con il quale si effettuerà l’accesso possiamo visualizzare alcune voci ed altre no, permettendo in questo modo di dare l’accesso solo ad alcuni profilo.
L’articolo vuole fornire al lettore le basi per realizzare un semplice menu che può essere esteso con le più comuni funzionalità da utilizzare in ambiente Asp.Net MVC Core.


Stesura del progetto


Si crea un nuovo progetto di tipo Asp.Net Core e nella finestra successiva selezionare tra i modelli preposti quello relativo ad Asp.Net MVC.
Dopo aver creato il progetto, nella finestra "Esplora soluzioni" facciamo click sulla cartella “Model” con il quale andremo a creare una classe per il menu.
Facciamo tasto destro sulla cartella e nel menu che viene visualizzato selezioniamo la voce “Aggiungi” e nel sottomenu la voce denominata “Classe” nella finestra che viene aperta impostiamo come nome “MenuModel” .
In questo file saranno presenti tre classi, una classe nel quale avremmo i sottomenu, che sono le voci che fanno parte di una voce di menu principale. Una classe del menu che rappresenta la voce che viene sempre visualizzata, ed infine la classe che contiene tutte e due le classi citate.
La classe “Sottomenu” contiene alcune proprietà importanti, come IdMenu che è il campo univoco della voce di tipo intero, un campo per l’ordinamento, una proprietà riguardante il testo da visualizzare, una proprietà se fa parte di un'altra voce, il nome del controller, il nome della Action, una lista contenente i profili autorizzati a visualizzare la voce e due proprietà di tipo testo, con il quale possiamo impostare le informazioni per eseguire una finestra modale oppure del codice Javascript.
Qui di seguito si riportano le suddette operazioni.


C#

public class SottoMenu

    {

 

        public Int16 IdMenu { get; set; }

 

        public Int16 OrdineMenu { get; set; }

 

        public string MenuTesto { get; set; }

 

        public Int16 ParentMenu { get; set; }

 

        public string ControllerName { get; set; }

 

        public string ActionName { get; set; }

 

        public List<string> ProfiliAutorizzati { get; set; }

 

        public string Modale { get; set; }

 

        public string CodiceJavascript { get; set; }

 

    }


Sempre nello stesso file dobbiamo scrivere una classe il quale contiene le voci di menu principali con le voci del sottomenu che fanno riferimento alla precedente classe,.
Qui di seguito la classe.


C#

public class MenuItem

    {

 

        public Int16 IdMenu { get; set; }

 

        public Int16 OrdineMenu { get; set; }

 

        public string MenuTesto { get; set; }

 

        public Int16 ParentMenu { get; set; }

 

        public string ControllerName { get; set; }

 

        public string ActionName { get; set; }

 

        public List<SottoMenu> MenuSub { get; set; }

 

        public string Modale { get; set; }

 

        public List<string> ProfiliAutorizzati { get; set; }

 

        public string CodiceJavascript { get; set; }

 

 

    }



Infine la classe che sarà utilizzate nei vari controller, e che sarà inizializzata in ogni pagina.





C#

public class MenuModel

    {

        public List<MenuItem> MenuItems { get; set; }

        //Costruttore

        public MenuModel()

        {

            MenuItems = new List<MenuItem>();

        }

    }


Qui di seguito il codice completo di tutto file completo di questa classe.


C#

namespace ArtMenuCoreMVC.Models

{

    public class MenuModel

    {

        public List<MenuItem> MenuItems { get; set; }

        //Costruttore

        public MenuModel()

        {

            MenuItems = new List<MenuItem>();

        }

    }

    public class MenuItem

    {

 

        public Int16 IdMenu { get; set; }

 

        public Int16 OrdineMenu { get; set; }

 

        public string MenuTesto { get; set; }

 

        public Int16 ParentMenu { get; set; }

 

        public string ControllerName { get; set; }

 

        public string ActionName { get; set; }

 

        public List<SottoMenu> MenuSub { get; set; }

 

        public string Modale { get; set; }

 

        public List<string> ProfiliAutorizzati { get; set; }

 

        public string CodiceJavascript { get; set; }

 

 

    }

 

 

    public class SottoMenu

    {

 

        public Int16 IdMenu { get; set; }

 

        public Int16 OrdineMenu { get; set; }

 

        public string MenuTesto { get; set; }

 

        public Int16 ParentMenu { get; set; }

 

        public string ControllerName { get; set; }

 

        public string ActionName { get; set; }

 

        public List<string> ProfiliAutorizzati { get; set; }

 

        public string Modale { get; set; }

 

        public string CodiceJavascript { get; set; }

 

    }

}



Ora dobbiamo creare una funzione che permette il  caricamento delle varie voci di menu.
Questa funzione che si trova nella cartella dei controller, permette di valorizzare le varie voci di menu e di ordinarli oltre che impostare la visibilità in base al profilo.
Facciamo click con il tasto destro sulla cartella “Controller” e nel menu che viene visualizzato aggiungiamo una nuova classe, come abbiamo fatto in precedenza.
La classe sarà denominata “Funzioni” ed al suo interno ci sarà un metodo denominato “GetMenu” il quale passiamo un parametro di tipo “string” per indicare il profilo che deve vedere le voci.
Qui di seguito le dichiarazione delle suddette operazioni.


C#

 

  public class Funzioni

    {

        public MenuModel GetMenu(string Profilo)

        {

           

            MenuModel returnMenu = new MenuModel();

            try

            {

                //Menu Home

                MenuItem menuHome = new MenuItem() { IdMenu = 0, OrdineMenu = 0, MenuTesto = "Home", ParentMenu = 0, ActionName = "Index", ControllerName = "Home", ProfiliAutorizzati = new List<string>() { "Amministratore", "Visualizzatore", "Avanzato", "UtenteEnte" }, Modale = "", CodiceJavascript = "onclick=HomePage();" };

                //Menu Categoria Anagrafica

                MenuItem menuAnagrafica = new MenuItem() { IdMenu = 1, OrdineMenu = 1, MenuTesto = "Anagrafica", ParentMenu = 0, ActionName = "Index", ControllerName = "Home", ProfiliAutorizzati = new List<string>() { "Amministratore", "Avanzato", "Modificatore", "UtenteEnte" }   };

                //SottoMenu Anagrafica

                SottoMenu SottmenuClienti = new SottoMenu() { IdMenu = 2, OrdineMenu = 1, MenuTesto = "Clienti", ParentMenu = 1, ActionName = "Index", ControllerName = "Clienti", ProfiliAutorizzati = new List<string>() { "Amministratore", "Avanzato", "Modificatore", "UtenteEnte" }, Modale = "", CodiceJavascript = "onclick=alert('Prova');" };

                SottoMenu SottmenuFornitori = new SottoMenu() { IdMenu = 3, OrdineMenu = 2, MenuTesto = "Fornitori", ParentMenu = 1, ActionName = "Index", ControllerName = "Fornitori", ProfiliAutorizzati = new List<string>() { "Amministratore", "Avanzato", "Modificatore", "UtenteEnte" }, Modale = "", CodiceJavascript = "" };

                SottoMenu SottmenuEnti = new SottoMenu() { IdMenu = 4, OrdineMenu = 3, MenuTesto = "Enti", ParentMenu = 1, ActionName = "Index", ControllerName = "Enti", ProfiliAutorizzati = new List<string>() { "Amministratore", "Avanzato", "Modificatore", "UtenteEnte" }, Modale = "", CodiceJavascript = "" };

                menuAnagrafica.MenuSub = new List<SottoMenu>();

                menuAnagrafica.MenuSub.Add(SottmenuClienti);

                menuAnagrafica.MenuSub.Add(SottmenuFornitori);

                menuAnagrafica.MenuSub.Add(SottmenuEnti);

                //Menu Contabilità

                MenuItem menuContabilita = new MenuItem() { IdMenu = 2, OrdineMenu = 2, MenuTesto = "Contabilita", ParentMenu = 0, ActionName = "Index", ControllerName = "Home", ProfiliAutorizzati = new List<string>() { "Amministratore", "Avanzato"  }  };

                //SottoMenu Contabilità

                SottoMenu SottmenuCassa = new SottoMenu() { IdMenu = 2, OrdineMenu = 1, MenuTesto = "Clienti", ParentMenu = 1, ActionName = "Index", ControllerName = "Clienti", ProfiliAutorizzati = new List<string>() { "Amministratore", "Avanzato" }, Modale = "", CodiceJavascript = "onclick=alert('Prova');" };

                menuContabilita.MenuSub = new List<SottoMenu>();

                menuContabilita.MenuSub.Add(SottmenuCassa);

              

                //Aggiungo le varie sottovoci di menu

 

                returnMenu.MenuItems.Add(menuHome);

                returnMenu.MenuItems.Add(menuAnagrafica);

                returnMenu.MenuItems.Add(menuContabilita);

                //Ordino i menu in modo che poi vengono visualizzati correttamente

 

                returnMenu.MenuItems = returnMenu.MenuItems.OrderBy(campo => campo.IdMenu).ThenByDescending(campo => campo.ParentMenu).ToList();

                //Gestione delle pagine al quale si è abilitati.

 

                returnMenu.MenuItems = returnMenu.MenuItems.OrderBy(campo => campo.IdMenu).ThenByDescending(campo => campo.ParentMenu).Where(profilo => profilo.ProfiliAutorizzati.Contains(Profilo)).ToList();

                   

 

                return returnMenu;

 

 

 

            }

            catch (Exception ex)

            {

                throw ex;

            }

 

 

 

 

        }

 

Naturalmente si prevede che per ogni voce del sottomenu è presente un Controller ed il relativo Action, in tal caso creare uno con la denominazione impostata nella proprietà “ActionName” e “ControllerName”.
Ora in ogni controller nell’evento di apertura, che di solito è “Index” inizializziamo il menu e passiamo come parametro il profilo desiderato. Possiamo anche fare delle prove con vari profili per verificare la visibilità delle voci.
Qui di seguito il frammento di codice delle suddette operazioni nell'evento Index del controller HomeController.



C#

public IActionResult Index()

        {

            Funzioni menu = new Funzioni();

            ViewBag.Menu = menu.GetMenu("Amministratore");

            return View();

        }


Ora dobbiamo fare la modifica alla pagina “_Layout” che è quella che viene visualizzata in ogni “view” in particolare il caricamento del menu che viene restituito dal “ViewBag”.
Dopo il tag “<div class="container">” inseriamo il codice di menu come riportato qui di seguito.


_Layout.cshtml



@{

            ArtMenuCoreMVC.Models.MenuModel MenuDaCaricare = new ArtMenuCoreMVC.Models.MenuModel();

            MenuDaCaricare = ViewBag.Menu;

            if (MenuDaCaricare != null)

            {

                <div class="col-md-3">

                    <ul class="nav-stacked">

                        @foreach (var VoceMenu in MenuDaCaricare.MenuItems)

                        {

                            if (VoceMenu.MenuSub == null)

                            {

                                <li> <a href="#" @VoceMenu.Modale @VoceMenu.CodiceJavascript>  @VoceMenu.MenuTesto</a></li>

                            }

                            else

                            {

                                <li>

                                    <a href="#" data-toggle="collapse" data-target="#sub1">  @VoceMenu.MenuTesto</a>

                                    <ul class="collapse" id="sub1">

                                        @foreach (var SottoMenuTrovato in VoceMenu.MenuSub)

                                        {

                                            <li class="col-md-12">

                                                <p class="linkMenu"> - <a  asp-area="" asp-controller="@SottoMenuTrovato.ControllerName" asp-action="@SottoMenuTrovato.ActionName">@SottoMenuTrovato.MenuTesto</a></p>

                                                </li>

                                        }

                                    </ul>

                                </li>

                            }

                        }

                    </ul>

                </div>

            }

        }


Qui di seguito si riporta il codice html completo della pagina _Layout


<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="utf-8" />

    <meta name="viewport" content="width=device-width, initial-scale=1.0" />

    <title>@ViewData["Title"] - ArtMenuCoreMVC</title>

    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" />

    <link rel="stylesheet" href="~/css/site.css" />

</head>

<body>

    <header>

        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">

            <div class="container">

                <a class="navbar-brand" asp-area="" asp-controller="Home" asp-action="Index">ArtMenuCoreMVC</a>

                <button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"

                        aria-expanded="false" aria-label="Toggle navigation">

                    <span class="navbar-toggler-icon"></span>

                </button>

                <div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">

                    <ul class="navbar-nav flex-grow-1">

                        <li class="nav-item">

                            <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Index">Home</a>

                        </li>

                        <li class="nav-item">

                            <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>

                        </li>

                    </ul>

                </div>

            </div>

        </nav>

    </header>

    <div class="container">

        @{

            ArtMenuCoreMVC.Models.MenuModel MenuDaCaricare = new ArtMenuCoreMVC.Models.MenuModel();

            MenuDaCaricare = ViewBag.Menu;

            if (MenuDaCaricare != null)

            {

                <div class="col-md-3">

                    <ul class="nav-stacked">

                        @foreach (var VoceMenu in MenuDaCaricare.MenuItems)

                        {

                            if (VoceMenu.MenuSub == null)

                            {

                                <li> <a href="#" @VoceMenu.Modale @VoceMenu.CodiceJavascript>  @VoceMenu.MenuTesto</a></li>

                            }

                            else

                            {

                                <li>

                                    <a href="#" data-toggle="collapse" data-target="#sub1">  @VoceMenu.MenuTesto</a>

                                    <ul class="collapse" id="sub1">

                                        @foreach (var SottoMenuTrovato in VoceMenu.MenuSub)

                                        {

                                            <li class="col-md-12">

                                                <p class="linkMenu"> - <a  asp-area="" asp-controller="@SottoMenuTrovato.ControllerName" asp-action="@SottoMenuTrovato.ActionName">@SottoMenuTrovato.MenuTesto</a></p>

                                                </li>

                                        }

                                    </ul>

                                </li>

                            }

                        }

                    </ul>

                </div>

            }

        }

        <main role="main" class="pb-3">

            @RenderBody()

        </main>

    </div>

 

    <footer class="border-top footer text-muted">

        <div class="container">

            &copy; 2020 - ArtMenuCoreMVC - <a asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>

        </div>

    </footer>

    <script src="~/lib/jquery/dist/jquery.min.js"></script>

    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>

    <script src="~/js/site.js" asp-append-version="true"></script>

    @RenderSection("Scripts", required: false)

</body>

</html>

Terminata questa modifica non ci resta che eseguire il nostro progetto e fare le prove sulle singole voci.
Naturalmente possiamo impostare anche un profilo con il quale non sono visibili determinate voci.

Conclusioni

Questo articolo ha fornito al lettore una tecnica per dotare le proprie applicazioni Asp.Net Core MVC di un menu laterale a comparsa con il quale rendere la navigazione della propria applicazioni più amichevole.
Naturalmente la flessibilità di questo menu permette anche di gestirlo con una base dati e renderlo ancora più personalizzato in ambito di utenti.
Asp.Net Core MVC è una tecnologia, con il quale si possono creare applicazioni web di tipo MVC per vari sistemi operativi, oltre al sistema operativo Windows.
Nell’articolo si è utilizzato la versione del Framework Core 3.1 con l’ambiente di sviluppo Microsoft Visual Studio Community 2019.