Yazılım-Netsentez

|||

ASP.NET MVC Web Uygulamaları İçin Birkaç Pratik Çözüm

Karşılaştığım bazı sorunlara bulduğum çözümleri burada açıklıyorum.

  • Hosting hizmeti yabancı bir ülkede olan herhangi bir serverdan yayımlanan MVC web sitesi Türk kültürüne nasıl uyarlanır? Özellikle tarihler nasıl Türkçe görünür?

  • Tarihlerde gün-ay-yıl sıralaması nasıl ayarlanır; gün, ay veya yıl gibi sadece belirli bir kısım nasıl çekilir?

  • Veriler küçükten büyüğe veya büyükten küçüğe nasıl sıralanır?

  • Veriler gruplara ayrılarak nasıl sunulur?

Ağ içinde yusufçık kuşu…

Web Sitesini Türk Kültürüne Uyarlamak

Visual Studio’da ASP.NET Web Application (.NET Framework) C# MVC olarak başlatılan şablon projenin kültürü, üzerinde çalıştığı serverın kültürüne bağlıdır. Türkçe Windows üzerinde geliştirdiğimiz bir projeyi yabancı bir ülkeden yayınlarsak özellikle tarihler bu ülkenin diliyle görünür. Siteyi Türkçe’ye uyarlamanın en pratik yolu Solution Explorer’da ana dizinde yer alan global.asax.cs dosyasında evrenselleştirme ayarlarında Türkçe’yi tanıtmak ve geçerli kültürü Türkçe’ye ayarlamaktır. Türkçenin uluslarası tanımı tr-trdir. Amerikan İngilizcesinin tanımı en-us dir. Her ülkenin kendine özgü bir kodu vardır.

global.asax.cs dosyasının ayarlama yapmadan önceki görünümü şöyledir:

using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;

namespace netsentezV1
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }
    }
}

Application_Start() metoduna şu eklemeyi yapıyoruz:

System.Globalization.CultureInfo.DefaultThreadCurrentCulture
 = new System.Globalization.CultureInfo("tr-tr");

global.asax.cs dosyamızın Türkçe’ye ayarlanmış durumu şöyle oluyor:

using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;

namespace netsentezV1
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            System.Globalization.CultureInfo.DefaultThreadCurrentCulture
             = new System.Globalization.CultureInfo("tr-tr");
        }
    }
}

Tarih Formatlamak

İster kod öncelikli, ister veri tabanı öncelikli olsun Entity Framework (EF) veri modelinden türetilen (scaffold) Viewler üzerinde tarih formatlamak bazen daha pratik olabilir. Veriyi Model veya Control içinde formatlarsak başka kullanımlar için formatlanmamış veriye ihtiyacımız olduğunda zorlanırız. Tarih verisini doğrudan view üzerinde Razor sentaksı kullanarak formatlamak mümkündür. Böylece başka Viewlerde başka formatlar kullanabiliriz.

Scaffold olarak türetilmiş bir Viewde formatlanmamış tarih şöyledir (item.date formatlanmamış tarihi göstermektedir):

<table class="table">
    @foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.title)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.blog)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.date)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.link1)
            </td>

        </tr>
    }

    </table>

Bu format, tarihleri rakam olarak, geçerli ayarlanan kültüre göre yıl, ay, gün gibi sıralayarak verir.

Örneğin; günü rakam olarak, ayı ad olarak yılı rakam olarak görmek istiyorum. Tarih formatlamada şu kodları kullanacağım;

  • dd: gün
  • MMMM: ay
  • yyyy: yıl

Sıralamayı istediğiniz gibi değiştirebilirsiniz. Veri dönüşü yaptığınız sıralamaya göre olacaktır. Gün, ay ve yıl için kullanılan harflerin sayısı dönecek verinin biçimini belirler. Formatlamanın çeşitli varyasyonlarına başka kaynaklardan bakabilirsiniz. Benim amacım Model maddesi olarak View’e gelen tarihi, bulunduğu bu yerde yukarıdaki tanımları kullanarak formatlamak.

@Html.DisplayFor(modelItem => item.date)

Tablo verisini şöyle değiştiriyorum:

@String.Format("{0:dd MMMM yyyy}", item.date)

Bu durumda elde ettiğim tarih örneğin 28 Aralık 2019 şeklinde oldu. Sadece yyyy yazarsanız sadece yılı elde edersiniz. Çeşitli şekillerde deneyerek bilginizi pekiştirebilirsiniz.

Verileri Sıralamak ve Gruplamak

Entitiy Framework veri modelinden View’e gelen veri, standart bir View’de bir sınıf (class) veri kümesinden oluşan Model’dir. Sınıfı, bir tablonun sütunları, kümeyi de bu sütunlara ait veri satırları olarak düşünebilirsiniz. Veriler model’e çoğunlukla sıralanmamış ve gruplanmamış olarak gelir. Bu verileri görmek istediğimiz şekle nasıl dönüştüreceğimizi bir örnek üzerinden açıklayayım.

Veri tabanında bir blog yayın listesi var. Bu listede Blog adı (.blog), Yayın Adı (.title), Yayın Linki (.link1) ve Yayın Tarihi (.date) yer alıyor. View’e gelen veri kümesini öncelikle yayımlanma tarihlerine göre son yayından ilk yayına doğru sıralamak istiyorum. Daha sonra bu sıralama temelinde blog yayınlarını yıllara ait gruplar halinde görmek istiyorum.

Scaffold’un ürettiği ilk View sayfası şöyledir:

<table class="table">
    @foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.title)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.blog)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.date)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.link1)
            </td>

        </tr>
    }
    </table>

foreach döngü satırında model verilerini tarihe göre sondan başa doğru sıralamak için şu LINQ komutunu ilave ediyorum. Bundan sonra veriler tarihe göre sıralanır.

@foreach (var item in Model.OrderByDescending(item => item.date) {

}

Daha sonra verileri yıllara göre gruplanmış halde görmek için tablo sunumu yerine liste <ul> sunumunu kullanıyorum. Çünkü her yıl grubunun yıl başlığını group.Key ayrı bir satırda görmek istiyorum. Verileri gruplara göre ayrı ayrı sıralamak için iç içe iki foreach döngüsü kullandım. Dış döngü gurupları döndürüyor. İç döngü gruplara ait verileri ayrı ayrı sıralıyor.

foreach (var group in Model.OrderByDescending(item => item.date)
.GroupBy(item => String.Format("{0:yyyy}", item.date)))
{
    <li>
        @Html.Encode(group.Key)
        <ul>

            @foreach (var item in group)
            {
                <li>
                    @Html.DisplayFor(modelItem => item.title) <br />
                    @Html.DisplayFor(modelItem => item.blog),
                    @String.Format("{0:dd MMMM yyyy}", item.date),
                    @Html.DisplayFor(modelItem => item.link1)
                </li>
            }
        </ul>
    </li>
}

Dikkat ettiyseniz dış foreach döngüsünde grup anahtarı group.Key olarak String.Format() ile sadece yılı çektim. Bu anahtara göre verileri grupladım. Daha sonra iç döngü ile grup içindeki verileri listeye alırken yine String.Format() ile gün, ay, yıl formatını kullandım.

Bir önceki ve bir sonraki yazı Markup Language - ML İşaret Dili Felsefesi Sosyal Medyadan Web Sitesine Eklentiler
Son yazılar Sosyal Medyadan Web Sitesine Eklentiler ASP.NET MVC Web Uygulamaları İçin Birkaç Pratik Çözüm Markup Language - ML İşaret Dili Felsefesi Merhaba GitHub