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?
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-tr
dir. 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");
}
}
}
İ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;
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.
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.