Postcodes csv bestand
Home

Postcodes csv bestand

Postcodes csv bestand

Het drieluik Model, View, Control wordt meestal in combinatie gebruikt met gegegevensopslag. In een eerste oefening gebruiken we MVC om gegevens uit een bestand in te lezen.

Probleem

We hebben de twee Excel bestanden van BPost samengevoegd in één csv bestand. Hieronder zie de eerste postscodes. Elke regel bestaat uit vijf 'kolommen':

  1. Postcode
  2. Plaats
  3. Provincie
  4. Localite (we gebruiken geen accenten, dus geen Localité maar Localite)
  5. Province

1000|BRUSSEL|Brussel (19 gemeenten)|BRUXELLES|Bruxelles (19 communes)
1005|Verenigde Vergadering van de Gemeenschappelijke ||Assemblée Réunie de la Commission Communautaire|
1006|Raad van de Vlaamse Gemeenschapscommissie||Raad van de Vlaamse Gemeenschapscommissie |
1007|Assemblée de la Commission Communautaire Française||Assemblée de la Commission Communautaire Française|
1008|Kamer van Volksvertegenwoordigers||Chambre des Représentants|
1009|Belgische Senaat||Senat de Belgique|
1011|Vlaams Parlement||Vlaams parlement|
1012|Parlement de la communauté française||Parlement de la Communauté française|
1020|Laken|Brussel (19 gemeenten)|Laeken|Bruxelles (19 communes)
1030|SCHAARBEEK|Brussel (19 gemeenten)|SCHAERBEEK|Bruxelles (19 communes)
1031|Christelijke Sociale Organisaties||Organisations Sociales Chrétiennes|
1033|RTL-TVI||RTL-TVI|
1035|Ministerie van het Brussels Hoofdstedelijk Gewest||Ministère de la Région de Bruxelles Capitale|
1040|ETTERBEEK|Brussel (19 gemeenten)|ETTERBEEK|Bruxelles (19 communes)
1041|International press center||International Press Center|
1043|VRT||VRT|
1044|RTBF||RTBF|
1046|European External Action Service||European External Action Service|
1047|Europees Parlement||Parlement Européen|
1048|Europese unie - Raad||Union Européenne - Conseil|
1049|Europese unie - Commissie||Union Européenne - Commission|
1050|ELSENE|Brussel (19 gemeenten)|IXELLES|Bruxelles (19 communes)
1060|SINT-GILLIS|Brussel (19 gemeenten)|SAINT-GILLES|Bruxelles (19 communes)
1070|ANDERLECHT|Brussel (19 gemeenten)|ANDERLECHT|Bruxelles (19 communes)
1080|SINT-JANS-MOLENBEEK|Brussel (19 gemeenten)|MOLENBEEK-SAINT-JEAN|Bruxelles (19 communes)
1081|KOEKELBERG|Brussel (19 gemeenten)|KOEKELBERG|Bruxelles (19 communes)
1082|SINT-AGATHA-BERCHEM|Brussel (19 gemeenten)|BERCHEM-SAINTE-AGATHE|Bruxelles (19 communes)

De gegevens zijn opgeslagen in een bestand met de naam Postcodes.csv. De applicatie moet het bestand openen, de gegevens inlezen en elke regel uit het bestand omzetten naar een object van het type Postcode. Alle omgezette regels moeten in een generieke lijst gestopt worden van het type List<Postcode>.

Je hebt een home pagina nodig die getoond wordt wanneer de gebruiker je website bezoekt. Dat is de 'vertrekpagina' van de website. Van daaruit kan de bezoeker verder navigeren.

Je hebt een pagina nodig om de postcodes te tonen.

Design

Mockup

We hebben twee pagina's nodig. Een Index pagina die het vertrekpunt is en waarop een link staat naar de Postcodes pagina. En een Postcodes pagina waarop we de lijst van de postcodes zullen tonen.

Oefening Postcodes csv bestand Mockup Index pagina
Oefening Postcodes csv bestand Mockup Index pagina
Oefening Postcodes csv bestand Mockup Postocdes pagina
Oefening Postcodes csv bestand Mockup Postocdes pagina

Overzicht

Oefening Postcodes csv bestand
Oefening Postcodes csv bestand

Data Store

De gegevens staan in het bestand met de naam Postcodes.csv. Zet dit bestand in de App_Data folder van je project.

DAL (data access layer)

Je hebt een klasse nodig om het tekstbestand van het OS over te brengen naar C#. Het tekstbestand staat in een folder op je harde schijf en behoort tot het Operating System. Je hebt dus een manier nodig om die vreemde eend in je C# omgeving binnen te halen. Daarvoor maken we een Lees methode in een Tekstbestand klasse. Deze klasse zetten we in de App_Code/Dal map met de naam Tekstbestand.cs.Zorg ervoor dat je Build Action eigenschap van dit bestand op Compile instelt:

Build Action Compile
Build Action Compile

Model

Het model staat in het bestand met de naam Postcode.cs en dat bestand staat in de Models folder. Je moet de structuur van het tekstbestand omzetten naar een gegevenstype dat door C# begrepen en gemanipuleerd kan worden. Eén regel uit het tekstbestand zet je om naar een object. De komma's verdelen de regel in properties. Meerdere omgezette regels stop je in een generieke lijst. De methode LeesUitCsvBestand() zet csv om in een generieke lijst met objecten en eigenschappen. De controller zal ervoor zorgen dat die lijst wordt aangemaakt en zal die tenslotte doorgeven aan de View met de naam PostCodes.

View

  1. De vertrekpagina heet standaard Index.cshtml en staat in de Home folder van de Views folder.
  2. De postcodes worden getoond op een pagina met de naam Postcodes.cshtml en staat ook in de Home folder van de Views folder. Om te beginnen zetten we zowel de Index.cshtml pagina als de Postcodes.cshtml pagina in dezelfde folder. In de View beschikken we over een Model object waarin de controller die de View heeft aangeroepen de generieke lijst met postcodes heeft geplaatst.

Controller

We hebben slechts één controllerklasse met de naam HomeController in het HomeController.cs bestand en die staat in de map Controllers. In de controllerklasse hebben we twee actiemethoden:

  1. een actiemethode om de startpagina van de website te tonen Index()
  2. een actiemethode om de postcodes op te halen en te tonen op Postcodes.cshtml

Oplossing

DAL

Deze code staat in App_Code/Dal/Tekstbestand.cs (zorg ervoor dat de Compile eigenschap is ingesteld).

using System;
using System.IO;

namespace Dal
{
    class Tekstbestand
    {
        private string text;

        public string Text
        {
            get { return text; }
            set { text = value; }
        }

        private string melding;

        public string Melding
        {
            get { return melding; }
        }

        private string fileName;

        public string FileName
        {
            get { return fileName; }
            set
            {
                this.fileName = value;
            }
        }

        public bool Lees()
        {
            // we gaan ervan uit dat er iets misloopt
            bool result = false;
            try
            {
                // Creëer een instantie van de StreamReader klasse om 
                // een bestand in te lezen. 
                // Het using statement sluit ook de StreamReader.
                // Core: using (StreamReader sr = File.OpenText(this.fileName))
                using (StreamReader sr = new StreamReader(this.fileName))
                {
                    // Lees tot het einde van het bestand
                    this.text = sr.ReadToEnd();
                    this.melding = String.Format(
                        "Het bestand met de naam {0} is ingelezen.Het bevat {1} karakters en {2} woorden en {3} regels.",
                        this.fileName, this.text.Length, this.text.Split(' ').Length, this.text.Split('\n').Length);
                    result = true;
                }
            }
            catch (Exception e)
            {
                // Melding aan de gebruiker dat iets verkeerd gelopen is.
                // We gebruiken hier de nieuwe mogelijkheid van C# 6: string interpolatie
                this.melding = $"Kan het bestand met de naam {this.fileName} niet inlezen.\nFoutmelding {e.Message}.";
            }
            return result;
        }
    }
}

Model

Het model staat in Models/Postcode.cs.

using System.Collections.Generic;

namespace LerenWerkenMetMVC.Models
{
    public class Postcode
    {
        private string code;

        public string Code
        {
            get { return code; }
            set { code = value; }
        }

        private string plaats;

        public string Plaats
        {
            get { return plaats; }
            set { plaats = value; }
        }

        private string provincie;

        public string Provincie
        {
            get { return provincie; }
            set { provincie = value; }
        }

        private string localite;

        public string Localite
        {
            get { return localite; }
            set { localite = value; }
        }

        private string province;

        public string Province
        {
            get { return province; }
            set { province = value; }
        }

        public string LeesUitCsvBestand(string fileName)
        {
            Dal.Tekstbestand bestand = new Dal.Tekstbestand();
            bestand.FileName = fileName;
            bestand.Lees();
            return bestand.Text;
        }

        public List<Postcode> GetList(string fileName)
        {
            string[] postcodes = this.LeesUitCsvBestand(fileName).Split('\n');
            List<Postcode> list = new List<Postcode>();
            foreach (string s in postcodes)
            {
                if (s != "")
                {
                    list.Add(this.ToObject(s));
                }
            }
            return list;
        }

        public Postcode ToObject(string line)
        {
            Postcode postcode = new Postcode();
            string[] values = line.Split('|');
            postcode.code = values[0];
            postcode.Plaats = values[1];
            postcode.Provincie = values[2];
            postcode.Localite = values[3];
            postcode.Province = values[4];
            return postcode;
        }
    }
}

View

De Index view staat in /Views/Home/Index.cshtml.

@{
    Layout = "~/Views/Shared/_LayoutPage.cshtml";
}
<div>
    Programmeren 3 Index pagina van de Home sectie
    <nav>
        <a href="/Home/Postcodes">Ga naar Postcodes</a>
    </nav>
</div>

De Postcodes view staat in /Views/Home/Postcodes.cshtml.

@model System.Collections.Generic.List<LerenWerkenMetMVC.Models.Postcode>
    <h2>Lijst postcodes</h2>
<hr/>
<article>
    <table border="1">
        @foreach (var element in Model)
        {
            <tr>
                <td>@Html.DisplayFor(modelItem => element.Code)</td>
                <td>@Html.DisplayFor(modelItem => element.Plaats)</td>
                <td>@Html.DisplayFor(modelItem => element.Provincie)</td>
                <td>@Html.DisplayFor(modelItem => element.Localite)</td>
                <td>@Html.DisplayFor(modelItem => element.Province)</td>
            </tr>
        }
    </table>
</article>

De master page staat in /Views/Shared/_LayoutPage.cshtml.

<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>@ViewBag.Title</title>
</head>
<body>
    <div>
        @RenderBody()
    </div>
</body>
</html>

Controller

De controllerklasse staat in /Controllers/HomeController.cs.

using System.Web.Mvc;

namespace LerenWerkenMetMVC.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult Postcodes()
        {
            ViewBag.Message = "Pagina met postcodes";
            LerenWerkenMetMVC.Models.Postcode postcode = 
                new LerenWerkenMetMVC.Models.Postcode();
            return View(postcode.GetList(Server.MapPath("~") + 
                "/App_Data/Postcodes.csv"));
        }
    }
}

JI
2017-01-05 00:57:50