ASP.NET Core MVC State Management Bölüm-1

052120_0847_ASPNETCoreM1.jpg

Merhabalar, bu yazım’da sizlere .net core state management (durum yönetim) nesnelerini anlatıyor olacağım.Http istekleri, durum bilgisi olmayan bir protokol’dür. Dolayısıyla kullanıcının istek taleplerinde kullanıcıya ait veya uygulamaya ait değerleri tutmayan bağımsız iletilerdir. Bu makale içerisinde bu değerleri nasıl yöneteceğimize değineceğim.

Makale içerisinde bakacağımız konu başlıkları sırası ile,

  • Cookike
  • Session state
  • TempData
  • Query strings
  • Hidden fields
  • HttpContext.Items
  • Cache

Cookie

Çerezler (cookies), verileri kullanıcının tarayıcısında deplolar. Tarayıcılar her istekle çerez gönderir, performans açısından boyutları küçük tutulması önemlidir. Ideal olarak, tanımlama bilgisini çerez içerisinde saklamalıyız ve uygulamayı kullanarak ilgili veriyi saklamalıyız. Çoğu tarayıcı, çerez boyutunu her bir dosya için 4096 byte olarak sınırlarlar ve belirli sayıda çerez tutmamıza izin verirler.

Kullanıcılar, çerezleri kolayca silebilir ve içerisindekileri görebilir. Eğer kullanıcı çerezleri temizlemezse belirtilen zamanda kendiliğinden silinecektir. Bu nedenle çerezleri hassas bilgileri saklamak için kullanmamalıyız ve değerlere güvenmemeli veya doğrulama olmadan kullanmamalıyız.

Çerezleri, kullanıcının bazı temel bilgilerini veya yaptığı belirli İşlemleri tutmak için kullanırız. Örnek olarak anket uygulamasında hangi seçeneği seçtiğiniz çerezler üzerinde saklayarak, kullanıcı tekrar aynı sayfaya geldiğinde eğer bir seçenek seçtiyse direk olarak o alanı seçili olarak getirmek gibi.

Örnek bir uygulama geliştirerek konuyu daha anlaşılır hale getirelim.

Projenizi visualstudio kullanarak açabilirsiniz. Makale boyunca tüm örnekleri CLI kullanarak visualstudio üzerinden anlatıyor olacağım..

Öncelikle yeni bir command prompt (mac kullananlar için terminal) açınız.

Sırası ile komutlarımız,

  1. cd Desktop => ilgili dizinimizi masaüstü olarak ayarlıyalım.
  2. mkdir StateManagement => StatManagement adında bir klasör oluşturalım
  3. cd StateManagement => dizin olarak, oluşturduğumuz klasörü belirleyelim
  4. dotnet new mvc -n CookiesApp -f netcoreapp3.1 => dotnet cli komutlarını kullanarak 3.1 versiyonu ile yeni bir mvc projesi oluşturuyoruz.
  5. cd CookiesApp => dizinimizi proje ana dizini olarak belirliyoruz.
  6. code . => code(boşluk).(nokta) diyerek vscode’u proje dizininde açıyoruz.

VisualCode açıldıktan sonra Views klasörü içerisinde yer alan Home\index view’ına gelelim ve aşşağıdaki gibi düzenleyelim.

@{


    string[] items = {"c#","java","python","c++","c","ruby","php","Groovy"};


}


<form method="POST">


    <div class="row">


        <div class="col">


            <h1 class="display-4 border-bottom pb-2">Hangi yazılım dilini kullanıyorsunuz! </h1>


        </div>


    </div>


    <div class="row row-cols-4 mt-5 shadow-sm">


        @foreach(string item in items){


        <div class="col mt-3">


            <div class="form-group">


                <div class="custom-control custom-radio">


                    <input name="survey" type="radio" class="custom-control-input" id="@item" value="@item">


                    <label class="custom-control-label" for="@item">@item</label>


                </div>


            </div>


        </div>


        }


        <div class="col-12">


            <button class="btn btn-outline-dark btn-sm mt-5 mb-3 float-right">Kaydet</button>


        </div>


    </div>


</form>

 

Ekran çıktısı;

Resim-1

Şimdi, ekran tasarımımız hazır olduğuna göre, kodlamaya geçebiliriz. HomeController içerisine gelerek aşşağıdaki gibi düzenleyelim.

HomeController içeriği;

using System;


using Microsoft.AspNetCore.Http;


using Microsoft.AspNetCore.Mvc;


namespace CookiesApp.Controllers


{


    public class HomeController : Controller


    {


        private static string COOKIE_KEY_SURVEY = "survey";


        public IActionResult Index()


        {


            // Kullanıcı, daha önce oy kullandıysa Request içerisindeki cookiler'den anahtar kelimeye göre değeri yakalıyoruz.


            var result = Request.Cookies[COOKIE_KEY_SURVEY];


            return View(nameof(Index), result);


        }


        [HttpPost]


        public IActionResult Index(string survey)


        {


            // yeni bir cookie ayar nesnesi oluşturuyoruz, cookie'nin kullanıcının browser'ında ne kadar yaşayacağını belirtiyoruz.


            // dikkat edilmesi gereken, zaman belirtirken, DateTime nesnesinin Add metotlarını kullanmamız gerektiğidir. kesin bir tarih vermememiz gerekir,


// o tarih birkez oluşacağından cookie'nin silinme işlemi gerçekleşmeyecektir ve kullanıcı çerezleri temizleyene kadar durmaya devam edecektir.


            CookieOptions option = new CookieOptions();


            // kullanıcının browser'ından oluştuktan 5 dakika sonra silinecektir. AddDays() => metodu ile gün bazlı değer verebilirsiniz.


            option.Expires = DateTime.Now.AddMinutes(5);


            // oluşturduğumuz ayar nesnesi ile değerimizi kullanıcıya göndereceğimiz cevap(response) içerisine ekliyoruz.


            Response.Cookies.Append(COOKIE_KEY_SURVEY, survey, option);


            return RedirectToAction(nameof(Index));


        }


    }


}

 

Komut ekranında, dotnet watch run komutunu çalıştırdığınızda http://localhost:5000/ port üzerinden sayfayı çalıştırınız. Eğer sayfada güvenlik uyarısı hatası alıyorsanız. Properties klasörü içerisinde yer alan lunchSettings.json dosyasında yer alan applicationUrl içerisindeki

https://localhost:5001
url’i siliniz ve server’ı Ctrl+C ile durdurup yeniden dotnet watch run komutuyla çalıştırınız.

Index sayfasına geldiğimizde bir programlama dili seçip kaydet dediğimizde 5dakikalığına brovser üzerinde çerez durmaya devam edecektir. Kontrol etmek için, sayfaya sağ tıklayıp incele(inspect) diyiniz. Ve resimdeki alana gelip değeri kontrol ediniz.

Resim-2

Kullanıcı, seçtiği değeri ekranda görebilmesi için Index view’I üzerinde değişiklik yaparak oy kullandıysa ona bir bildirim ekranı gösteriyor olalım.

@{


string[] items = {"c#","java","python","c++","c","ruby","php","Groovy"};


}


@if(!string.IsNullOrWhiteSpace(Model)){


<div class="row mt-5">


    <div class="col">


        <h1 class="display-4">Kullandığınız yazılım dili</h1>


        <h1 class="display-4  text-center rounded shadow-sm bg-warning pb-3"> @Model </h1>


        <p>yeni bir seçim için lütfen  <a asp-action="remove">tıklayınız</a></p>


    </div>


</div>


}


else{


<form method="POST">


    <div class="row">


        <div class="col">


            <h1 class="display-4 border-bottom pb-2">Hangi yazılım dilini kullanıyorsunuz!</h1>


        </div>


    </div>


    <div class="row row-cols-4 mt-5 shadow-sm">


        @foreach(string item in items){


        <div class="col mt-3">


            <div class="form-group">


                <div class="custom-control custom-radio">


                    <input name="survey" type="radio" class="custom-control-input" id="@item" value="@item">


                    <label class="custom-control-label" for="@item">@item</label>


                </div>


            </div>


        </div>


        }


        <div class="col-12">


            <button class="btn btn-outline-dark btn-sm mt-5 mb-3 float-right">Kaydet</button>


        </div>


    </div>


</form>


}

 

Alanı düzenlediğimizde, oy kullandığımızda ekran görüntüsü aşşağıdaki gibi olacaktır.

Şimdi cookie’i silmek için Controller’a gelerek düzenleme yapalım.

HomeController kısmına geliniz,

   

  public IActionResult Remove()


        {


            CookieOptions option = new CookieOptions();


            // Add metoduna -1 değeri verdiğimizde cookie'i silmiş oluruz.


            option.Expires = DateTime.Now.AddMinutes(-1);


            Response.Cookies.Append(COOKIE_KEY_SURVEY, "", option);


            return RedirectToAction(nameof(Index));


        }

 

Ve yukarıdaki ActionResult’I ekleyiniz. Artık yeni bir seçim için yapmanız gereken butona tıklayıp yeni bir dil seçiyor olmanız.

 

Bu konuyla ilgili sorularınızı  alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.

Referanslar        

www.mshowto.org

TAGs:ASP.NET Core MVC State Management,MVC Nedir,

Yazı gezinmesi

Mobil sürümden çık