Over deze website

De website waar je nu naar kijkt, de teksten die je leest en de afbeeldingen die je ziet zijn bijna helemaal door mijzelf gemaakt.


Door het maken van deze website heb ik veel geleerd over ASP.net 4.x, MySQL, Bootstrap 4.0 en het responsive maken van een website. Op deze pagina ga ik langzamerhand meer uitleg en voorbeelden geven over de werking van deze website. 

De website is ontwikkeld en onderhouden in Microsoft Visual Studio, ik gebruik op dit moment Visual Studio Express 2015 for Web. De website is objectgeoriënteerd opgebouwd en bevat globaal de volgende componenten:
  • Een site.master voor de weergave en apart VB bestand voor de code
  • Diverse usercontrols voor specifieke functies (agenda en contactformulier bijvoorbeeld)
  • Een responsive hoofdmenu met 3 niveau's (zie hieronder meer informatie)
  • Een apart object voor de verbinding met de MySQL Database
  • MySQL database met diverse tabellen en joins tussen de tabellen
  • Een zelf ontwikkelde CMS tool om de website te kunnen beheren, daarbij maak ik gebruik van CKeditor en FileGridVB (aangepast).



Update naar ASP.Net Core 2.0

In februari 2018 ben ik begonnen met het ontdekken van Visual Studio 2017 en het opzetten van een website is ASP.Net Core 2.0. Het doel hiervan is om mijn eigen website naar deze meest recente technologie om te zetten en daarmee mijn kennis en ervaring in het programmeren van website te vergroten. En als je dan toch bezig bent, gelijk maar even omschakelen naar C#. Vooralsnog gaat dit prima! Binnenkort volgt meer hierover..




Menu

Het menu is gebasseerd op een voorbeeld van deze pagina  http://forums.asp.net/t/1481356.aspx?Menu+control+in+Asp+Net+not+working+for+third+level, maar ik heb enkele verbeteringen doorgevoerd zodat het past in deze website.

Door de update naar Bootstrap 4.0 heb ik de layout van de site aangepast maar werkt de navigatie ook niet meer. Bootstrap 4.0, Jquery en Popper zijn nu geïntegreerd in de website. Om het ASP:menu object goed weer te geven met Bootstrap heb ik de code aangepast, een voorbeeld hier:



<nav class="navbar navbar-expand-md navbar-light" style="background-color: #e3f2fd;">
 <a class="navbar-brand" href="/">Sakedevries.nl</a>
  <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
   <span class="navbar-toggler-icon"></span>
  </button>
	 
	  <div class="collapse navbar-collapse" id="navbarSupportedContent">
	   <asp:Menu ID="MainMenu" runat="server" Orientation="horizontal" CssClass="navbar-nav mr-auto" StaticMenuStyle-CssClass="nav-item" StaticSelectedStyle-CssClass="nav-item" StaticSubMenuIndent="16px" DynamicMenuStyle-CssClass="nav-item dropdown-menu" RenderingMode="List" role="navigation" itemscope="itemscope" itemtype="https://schema.org/SiteNavigationElement" >
	    <LevelMenuItemStyles>
	     <asp:MenuItemStyle CssClass="dropdown-item" HorizontalPadding="15px" Height="50px" VerticalPadding="15px" />
	    </LevelMenuItemStyles>
	    <LevelSelectedStyles>
	     <asp:MenuItemStyle CssClass="nav-item active" Font-Underline="False" />
	    </LevelSelectedStyles>
	    <StaticHoverStyle Font-Underline="true" />
	    <StaticSelectedStyle Font-Bold="true"   />
	     <DynamicMenuItemStyle CssClass="dropdown-item" />
	   </asp:Menu>
	  </div>
</nav>




Sitemap

Voor zoekmachines is het relevant om een sitemap te hebben, zodat ze beter kunnen bepalen hoe vaak een website of specifieke pagina bijgewerkt wordt. Via Google had ik deze pagina gevonden met een voorbeeld van een Sitemap geschreven in ASP.Net met C#. Dit heb ik als basis gebruikt en aangepast voor deze website. Uit deze onderstaande code rolt een XML sitemap genaamd sitemap.ashx :


Imports System
Imports System.Web
Imports System.Configuration
Imports System.Data
Imports System.Text
Imports System.Xml
Imports MySql.Data.MySqlClient

Public Class sitemap : Implements IHttpHandler

    Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
        context.Response.ContentType = "text/xml"

        'Start xml document
        Dim writer As New XmlTextWriter(context.Response.OutputStream, Encoding.UTF8)
        writer.WriteStartDocument()
        writer.WriteStartElement("urlset")
        writer.WriteAttributeString("xmlns", "https://www.sitemaps.org/schemas/sitemap/0.9")

        'Set SQL query for MySQL database
        Dim pagesSQL As String
        pagesSQL = "SELECT * FROM dbase.pages"

        Dim url As String = "https://www.sakedevries.nl/"

        Dim dbc As New DBConnect
        Dim myDataSet As New DataSet()
        myDataSet = dbc.DBSelect(pagesSQL)

        Dim dv As New DataView()
        Dim dr1 As DataRow
        Dim dr2 As DataRow
        Dim dr3 As DataRow

        dv.Table = myDataSet.Tables(0)
        dv.RowFilter = "parentmenu=1"
        dv.RowStateFilter = DataViewRowState.CurrentRows

        'loop through main pages
        For Each dr1 In dv.ToTable().Rows
            Dim dr1url As String = url & dr1.Item("pages.url").ToString
            Dim dr1date As String = String.Format("{0:yyyy-MM-dd}", dr1.Item("pages.updated"))
            If dr1date = "" Then
                dr1date = String.Format("{0:yyyy-MM-dd}", dr1.Item("pages.created"))
            End If

            writeXMLelement(writer, dr1url, dr1date)

            Dim dvChild As New DataView(myDataSet.Tables(0), "parentmenu=" & dr1.Item("pages.pid").ToString() & "", "", DataViewRowState.CurrentRows)

            'loop through sub pages
            For Each dr2 In dvChild.ToTable().Rows

                Dim dr2url As String = url & dr1.Item("pages.url").ToString & "/" & dr2.Item("pages.url").ToString
                Dim dr2date As String = String.Format("{0:yyyy-MM-dd}", dr2.Item("pages.updated"))
                If dr2date = "" Then
                    dr2date = String.Format("{0:yyyy-MM-dd}", dr2.Item("pages.created"))
                End If

                writeXMLelement(writer, dr2url, dr2date)

                Dim dvSubChild As New DataView(myDataSet.Tables(0), "parentmenu=" & dr2.Item("pages.pid").ToString() & "", "", DataViewRowState.CurrentRows)

                'first check for sub sub pages
                If Not dvSubChild.ToTable().Rows.Count = 0 Then

                    'loop through sub sub pages
                    For Each dr3 In dvSubChild.ToTable().Rows

                        Dim dr3url As String = url & dr1.Item("pages.url").ToString & "/" & dr2.Item("pages.url").ToString & "/" & dr3.Item("pages.url").ToString
                        Dim dr3date As String = String.Format("{0:yyyy-MM-dd}", dr3.Item("pages.updated"))
                        If dr3date = "" Then
                            dr3date = String.Format("{0:yyyy-MM-dd}", dr3.Item("pages.created"))
                        End If
                        writeXMLelement(writer, dr3url, dr3date)
                    Next
                End If
            Next
        Next
 
        'close xml document
        writer.WriteEndElement() 'urlset closing
        writer.WriteEndDocument()
        writer.Flush()
        context.Response.End()

    End Sub

    'routine to write element for the page
    Private Sub writeXMLelement(writer As XmlTextWriter, urltowrite As String, pageupdated As String)
        writer.WriteStartElement("url")
        writer.WriteElementString("loc", urltowrite)
        writer.WriteElementString("lastmod", String.Format("{0:yyyy-MM-dd}", pageupdated))
        writer.WriteElementString("changefreq", "monthly")
        writer.WriteElementString("priority", "0.5")
        writer.WriteEndElement()

    End Sub

    Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
        Get
            Return False
        End Get
    End Property