ChildActionOnly Attribute Kullanımı

ChildActionOnly Attribute’ı hangi method’un üzerinde belirlenirse o sayfa başka sayfaların içinde kullanılabilir bir sayfa olmuş olur direk erişim sağlanmaz.(Genelde PartialView için kullanılır.)

Örneğin HomeContreller’ımızda 1 tane PartialView  ve 1 tanede ActionResult oluşturalım burda PartialView’ımız sadece başka sayfalar içinde görüntülenebilmesi için kısıtladır.

[ChildActionOnly]
public PartialViewResult Login()
{
   return PartialView(“_Login”, new LoginModel());

}

[HttpPost]
public ActionResult Login(LoginModel model)
{
   return RedirectToAction(“Index”, “Home”);
}

//Kullanımı;

_Layout.cshtml
@{ Html.RenderAction(“Login”); }

MVC Attribute Kullanımı

MVC Attribute aşağıdaki gibi kullanabilirsiniz.

Filter  Interface  Default Implementation

 Authorization Filter  IAuthorizationFilter AuthorizeAttribute
 Action Filter  IActionFilter ActionFilterAttribute
 Result Filter  IResultFilter ActionFilterAttribute
 Exception Filter  IExceptionFilter HandleErrorAttribute

Authorization : Diğer filtreler ve Action metodlardan önce çalışmaktadır.Controller ya da Controller içindeki Action metoda erişim kısıtlamak için kullanılır.
Exception : Hata durumlarında çalışan filtredir.
Action : Herhangi bir Controller sınıfında bulunan Action metottan önce ya da sonra çalışır.
Result : Action Result çalıştırılmadan önce ya da çalıştırıldıktan sonra çalışır.

public class AttrDateSection : ActionFilterAttribute
{
    //Attribute olarak eklenen actiondan önce çalışacak methodumuz.
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    {
        filterContext.Controller.ViewData["selectdate"] = DateTime.Now;
        base.OnActionExecuting(filterContext);
    }
}

Verilen tarihin gün, hafta, ay ve yıl şeklinde görünümü

public ActionResult Index()
{
    DateTime isteilenTarih = DateTime.Now;
     Date date = GetDate(isteilenTarih); //Methodu çağır
    return View();
}

public Date GetDate(DateTime currentDate)
{
    System.Globalization.CultureInfo currentCulture = new System.Globalization.CultureInfo("tr-TR");
    Date date = new Date();
    date.day = currentDate.Day;
    date.dayName = currentDate.ToString("dddd", currentCulture);

    date.week = currentCulture.Calendar.GetWeekOfYear(new DateTime(currentDate.Year, currentDate.Month, currentDate.Day), currentCulture.DateTimeFormat.CalendarWeekRule, currentCulture.DateTimeFormat.FirstDayOfWeek);
    int delta = DayOfWeek.Monday - currentDate.DayOfWeek;
    if(delta > 0) delta -= 7;
    DateTime firstdayofweek = currentDate.AddDays(delta);
    DateTime lastdayofweek = firstdayofweek.AddDays(7);
    date.weekName = String.Format("{0:dd MMM}", firstdayofweek) + " - " + String.Format("{0:dd MMM yyyy}", lastdayofweek);

    date.month = currentDate.Month;
    date.monthName = currentDate.ToString("MMMM yyyy", currentCulture);

    date.year = currentDate.Year;
    date.yearName = currentDate.ToString("yyyy");

    return date;
}

public class Date
{
    public int day {get;set;}
    public string dayName { get; set; }
    public int week { get; set; }
    public string weekName { get; set; }
    public int month { get; set; }
    public string monthName { get; set; }
    public int year { get; set; }
    public string yearName { get; set; }
 }

MVC ActionResult Türleri

  • ContentResult : Metinsel içerik döndürür.
  • EmptyResult : Herhangi bir değer döndürmez.
  • FileResult : Binary formatında dosya içeriği döndürür.
  • HttpUnauthorizedResult : Yetkisiz HTTP isteği sonucu döndürür.
  • JavaScriptResult : JavaScript içeriği döndürür.
  • JsonResult : Json olarak formatlanmış içerik döndürür.
  • RedirectResult : Farklı bir Action’a yönlendirme yapar.
  • RedirectToRouteResult : Farklı bir Action’a, belirlenen Route kurallarına göre, yönlendirme yapar.
  • ViewResultBase : View içeriği döndürür.

Basit bir mvc projemisinin dizin yapısı

  • App_Data : Proje içerisinde ki veritabanı vb. veri kaynaklarının, dosyalar halinde eklendiği klasördür.
  • App_Start : Projenin ilk açılışı esnasında (sunucunun ilk başlatılışı ya da yeniden başlatılması), işlem yapması istenilen sınıfların, filtrelerin, metodların bulunduğu klasördür. Örneğin Route, yani sayfa yönlendirme dosyasının ya da projeye eklediğimiz JavaScript, Css gibi dosyaların sıkıştırılarak istemciye gönderilmesi mimarisi olan BundleConfig gibi dosyaları burada barındırırız.
  • Content : Bu klasör, zorunlu olmamakla birlikte genelde css dosyaları bu klasörde barındırılabilir.
  • Controllers : Controller dosyalarının barındırıldığı klasördür.
  • fonts : Asp.Net Mvc 5 sürümü ile birlikte, örnek projeye eklenen (bu klasörü kullanmak zorunda değilsiniz), font dosyalarını barındırabileceğiniz alandır.
  • Models : Model dosyalarının barındırıldığı klasördür.
  • Scripts : Javascript tarzı script dosyalarını barındırabileceğiniz alandır.
  • Views : View dosyalarının barındırıldığı klasördür.​
  • favicon.ico : Tarayıcının üst kısmında ve favori siteler kısmında görünen ikondur.
  • Global.asax : Sitenin genelinde yapılan işlemlerin kontrol edilmesini sağlar. Örneğin bir üye oturum açtığında, sunucu ilk açıldığında, oturum kapatıldığında gibi aksiyonlar esnasında, yapılması gerekenleri bu sınıf içerisinde kontrol edebiliriz.
  • packages.config : Proje de kurulu olan frameworklerin kayıtlı olduğu yerdir. Buraya genelde Nuget Paket Yöneticisi vasıtasıyla paketler kurulabilir.
  • Project_Readme.html : Örnek proje hakkında Microsoft’un hazırladığı bilgilendirme sayfasıdır.
  • Startup.cs : Daha önceden App_Start klasörünün altında bulunan bu dosya, Mvc 5 sürümü ile birlikte ana dizine alınmış durumdadır.
  • Web.config : Proje ile ilgili tüm merkezi ayarların saklandığı yerdir. E-posta hesap bilgileri, Cookie süreleri, Sql bağlantı bilgileri vb. tüm bilgiler bu alanda kaydedilebilir ve düzenlenebilir.

Javascript Dosyalarındaki -vsdoc dosyaları ne işe yarar?

Öncelikle Intellisense Nedir Öğrenelim;
Microsoft’un Görsel Geliştirme Ortamlarında olan (IDE), kod tamamlama özelliğidir. bir geliştirici olarak daha hızlı ve yanlışsız kod yazmanızı sağlar. Bir intellisense önerisini kabul etmek için açılan listeden ok tuşları yardımı ile seçtikten sonra TAB, ENTER, ya da BOŞLUK tuşlarından birisine basarak kullanabilirsiniz. Ya da bu işlemi fare ile yaparsınız. Herhangi bir durumda intellisense öneri listesini görmek için Ctrl + Boşluk tuş kombinasyonunu kullanabilirsiniz.

-vsdoc eklentileri Visual Studio Intellisense(Kod tamamlama) yardım dosyası olarak kullanılır.

Ör: jquery.validate-vsdoc.js dosyası jquery validate için Intellisense oluşturmada kullanılır. Buna benzer -vsdoc (sanırım Visual Studio Documnent) karşınıza çıkmıştır.

WebConfig’de compilation nedir?

ASP.NET uygulamalarında, web.config dosyası içerisinde yukardakine benzer bir satır göreceksiniz. ASP.NET 1.1’de “debug” parametresinin “default” değeri “true” iken, ASP.NET 2.0’da uygulamayı debug etmek istediğinizde size bu parametreyi tanımlamak isteyip istemediğinizi sorar. Sonuçta, geliştirme ortamından alınan hemen her web uygulamasında bu parametrenin değeri “true” olacaktır. Geliştirme esnasında bu parametrenin değeri zaten “true” olmalıdır, çünkü zaten uygulamayı “debug” etmemiz gerekmektedir. Ancak, gerçek (production) ortamda bu parametre kesinlikle ve kesinlikle “false” olarak değiştirilmelidir. Gerçek ortama koyacağımız uygulamaların “debug” edilmesi zaten tamamlanmış, hatalardan arındırılmış olması gerekir. Genel olarak buraya kadar anlattıklarım herkese mantıklı görünse de, pek çok kişi bu parametrenin önemini göz ardı eder ve üzerinde durmaz. Dolayısıyla bize gelen çağrıların büyük kısmında gerçek ortamdaki uygulamaların “debug” modda çalıştığını görürüz. Peki ama bu parametre ne kadar önemli olabilir? Gerçek ortamda “debug” modda çalışan bir uygulamada ne gibi sorunlarla karşılaşabiliriz? Bu soruların cevabı, ASP.NET 1.1’den mi, 2.0’dan mı bahsettiğimize göre küçük farklılıklar gösterse de, ana hatlarıyla toparlamaya çalışacağım:

  • Debug modda derlenen uygulamalarda pek çok optimizasyon yapılmayacaktır. Elbette bu da performans kaybına neden olacaktır.
  • Debug modda derlenen uygulamalarda zaman aşımı değerleri (timeout) dikkate alınmaz. Bunun çok basit ve mantıklı bir nedeni vardır: Uygulama geliştirirken bazen kodun bir yerine “breakpoint” koyarız ve uygulama oraya geldiğinde dakikalarca kodu inceleriz. Biz bunu yaparken uygulamamızın zaman aşımı hatası alması pek de hoş olmazdı. Zaman aşımı değerlerinin dikkate alınmaması, gerçek ortamlarda pek çok soruna neden olabilir. Örneğin, veritabanında yaşanan bir sorunun uygulamamızı tamamen çalışamaz hale getirmesi (deadlock) mümkün olabilecektir.
  • Çalışma esnasında fazladan bazı (debugging ile ilgili) bilgiler hafızada tutulacağından hafıza ve işlemci kullanımı çok daha yüksek olacaktır.
  • Uygulamanın derlenme süresi çok daha uzun olacaktır. Bunun nedenı yine bir takım optimizasyonların yapılmayacak olmasıdır.

Yukarıda bahsettiklerimi kaba bir özet olarak düşünebilirsiniz. Internet üzerinde çok daha detaylı çok sayıda makale bulabilirsiniz bu konuyla ilgili. ÇÖZÜM: Gerçek ortama taşınan her uygulamanın web.config dosyasını kontrol edin. Bu parametrenin gücünü hafife almayın. ASP.NET 2.0’la beraber, bu anlamda işimizi çok kolaylaştıran bir parametremiz oldu: “retail”. Machine.config içerisine ekleyebileceğiniz bu parametre ile, o makinede çalışan tüm web uygulamalarını, web.config’lerinde ne yazarsa yazsın, “release” moda almış olursunuz:

<configuration>
    <system.web>
          <deployment retail="true"/>
    </system.web>
</configuration>

Alıntıdır.

Glimpse Nedir?

Glimpse açık kaynak kodlu bir uygulamadır. Tarayıcı üzerinden çalışma zamanlarını, server configuration’ları, request ve data kullanımını görebileceğiniz bir Nuget Package’dir. Projenize yüklemek için sadece ilgili Nuget Package larını yüklemeniz gerekiyor.

Package Manager Console’u açıp açıp => Önce “Install-Package Glimpse“, daha sonrada “Install-Package Glimpse.Mvc4” yazmanız yeterlidir. Ayrıca aktive etmek için “http://localhost:portno/Glimpse.axd” adresine gidip oradan “Turn Glimpse On“, deaktif etmek içinde yine adrese gidip “Turn Glimpse Off” demeniz yeterlidir.

Tüm bunları yaptıktan sonra Home Controller içerisine Index adında bir View ekledim ve gelin birlikte Glimpse ile hangi ViewEngine ler çalışıyor ve nelere bakıyor bunları görelim.:glimpse_views_viewengine_partial
Böylece ASP.NET MVC’nin çalışırken hangi ViewEngine’lere baktığını, ve küçük bile olsa kaybettirdiği performansı görebiliyoruz. Sonuçta bir proje içerisinde onlarca View’iniz olabilir ve bunların her birisine bu şekilde bakılması performans için önemli diyeceğimiz bir miktara çıkacaktır.

Performans İçin Kullanılmayan View Engine’leri Devre Dışı Bırakmak

ASP.NET MVC caching konusunda Partial, View ve Display/Editor Template leri açısından genel olarak oldukça iyidir. Fakat eğer ASP.NET MVC projeniz içerisinde sadece tek türde View Engine kullanıyorsanız, diğer kullanılmayan View Engine’leri devre dışı bırakmak performans açısından yapılması gereken işlemlerden birisidir.
Html.EditorFor, Html.DisplayFor gibi model based Helper’ları View’ler içerisinde kullanıyorsanız, ilgili Helper, HTML markup ı olarak oluşturulmadan önce tüm View Engine’leri kontrol ederek bir HTML markup a çevirecek bir template aranmaktadır. Ne kadar fazla View Engine’niniz varsa bu işlem o kadar uzun sürecektir.

Ne yapmalıyız bunun için?
global.asax dosyası içerisindeki Application_Start metotunun içerisine aşağıdaki kodu yazıyoruz:
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new RazorViewEngine());

Projede Kaç Tane View Engine Var? Gerçekten Tüm View Engine’lere Bakılıyor Mu?
global.asax içerisindeki Application_Start metotunun son satırına break point koyup, default olarak oluşturulan Visual Studio 2012 ile bir ASP.NET MVC 4 Basit Template projesinde kaç adet View Engine
var inceliyoruz:
global_asax_view_engines_count_webformviewengine_razorviewengine

Projemize sadece Home adında bir controller ekleyelim ve projeyi çalıştırdığımızda hem .aspx li
dosyalara hem de .cshtml / .vbhtml türünde index veya master/layout lara baktığını göreceğiz:

index_bulunamadi_view_engine_asp_net_4