ASP.Net LAYOUT & VIEWSTART

LAYOUT
Layout sayfaları web sitesinin temel tasarımını bütün sayfalar için korumaya yarar. Web sayfamızda değişmeyen parçalar vardır. Mesela ana menü, site logosu ve ya site hatitasını gösteren alanlar. Tüm bu alanlar bütün sayfalarımız için ortaktır.

Sitemizde değişmeyen alanları bütün sayfalarda tekrar yazmak yerine, bu alanlardan oluşan bir şablon hazırlayıp biz sadece değişen sayfaları hazırlasak daha iyi bir çözüm olur. Bu çözümün MVC Razor için adı Layout sayfalarıdır.
Web Forms mimarisine yakın olanlar MasterPage kavramını bilirler. Layout ile Master page aynı şeydir. Birden fazla değişen alanlar tasarlanabilir.
Örnek bir Layout sayfası kodu aşağıdadır;


    @ViewBag.Title
    
        

@ViewBag.Title

@RenderBody()
@RenderBody() bu şablonu kullanacak olan sayfayı içerir. Şimdide bu şablonu kullanacak olan View sayfamızın kodlarını yazalım;
@{
    Layout = "~/Views/Shared/SiteLayout.cshtml";
    View.Title = "index sayfası!";
}

Burası index sayfası içeriğidir.


Index sayfasının içerisinde Layout sayfasını tanımladık. Bu sayfa artık SiteLayout sayfasını şablon olarak kullanacaktır. Sayfanın HTML çıktısı aşağıdaki gibidir.



    The Index!
    
        

index sayfası!

Burası index sayfası içeriğidir.

Bununla birlikte Layout sayfamız birden çok güncellenen alanda içerebilir. Örneğin;



    @ViewBag.Title
    
        

@ViewBag.Title

@RenderSection("Header")
@RenderBody()
@RenderSection("Footer")

Bu Layout sayfasını kullanan Index sayfamızın güncellenmiş hali;

@{
    Layout = "~/Views/Shared/SiteLayout.cshtml";
    View.Title = "index sayfası!";
}
@section Footer {
    Burası header.
}
 

Burası index sayfası içeriğidir.

@section Footer { Burası footer. }

Eğer Layout sayfasında tanımladığımız section alanını View sayfası içerisinde tanımlamazsak, hata alırız bunu engellemek için

@RenderSection("Footer", required: false)

şeklinde bir tanımlama yaparsak View sayfasında tanımlamadığımız section alanları için hata almayız. Peki tanımlanmayan section alanları için varsayılan olarak bir HTML yazdırabilir miyiz? Tanımlanmayan section alanları için varsayılan bir HTML yazdırmak için aşağıdaki gibi bir yöntem kullanabiliriz.

@if (IsSectionDefined("Footer")) { RenderSection("Footer"); } else { varsayılan footer alanı. Eğer bir section alanı tanımlanmamışsa bu alan gösterilir. }

VIEWSTART
Yukarıda yazdığımız Index sayfası kodlarında Layout sayfasını her defasında tanımladık. Birden çok değişen sayfası kullanacağımız zaman her sayfada Layout sayfasını tanımlamak yerine, bir kere tanımlamak daha mantıklıdır.
Uygulama için varsayılan bir Layout sayfası belirleyip, içerik sayfalarında da her defasında Layout sayfasını tanımlamayı engellemek için _ViewStart.cshtml sayfası belirleyip, uygulamanın kullanacağı varsayılan Layout sayfasını belirleyebiliriz. ViewStart sayfasının içeriği;

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

Views kalsörünün altında böyle bir sayfa belirlersek artık içerik sayfalarında tekrardan Layout sayfasını tanımlamaya gerek kalmaz. Sadece farklı bir Layout sayfası kullanacak olan View sayfalarında bunu tanımlarız.