Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
Server-Side Rendering Ne Zaman? MVC, Razor Pages, Blazor SSR ve Angular SPA Arasında Seçim
Server-side rendering; SEO, hızlı ilk yükleme, form ağırlıklı iç uygulama ve küçük ekip için güçlü, yoğun etkileşim ve çok istemcili API için SPA daha uygun. Aynı listeyi MVC controller'ı ve Razor Page ile yazıp framework log'larında isteğin yaşam döngüsünü izliyor, 474 byte'lık Angular kabuğunu 2,5 KB'lık hazır HTML ile karşılaştırıyor ve Blazor SSR'ın yerini tartışıyoruz.
ASP.NET Core MVC Pattern'i Pratikte: Controller, View, ViewModel ve Conventional Routing
ASP.NET Core MVC'de controller Controller'dan türer, view'ı adıyla Views/<Controller> ve Shared klasörlerinde bulur, sayfanın verisini ViewBag yerine tip güvenli bir ViewModel ile alır. dotnet new mvc yapısını, conventional routing'i, RedirectToAction'ı, Admin area'sını ve route sırası değişince link'lerin sessizce yanlış adres ürettiği gerçek bir hatayı Bookstore üzerinde görüyoruz.
Razor Syntax ve Layout'lar: @ İfadeleri, HTML Encoding, _Layout, Section'lar, _ViewStart ve _ViewImports
Razor, @ ile yazılan her değeri varsayılan olarak HTML encode eder; bu XSS'i kapatır ama Türkçe karakterleri de ı gibi entity'lere çevirir, WebEncoderOptions ile düzeltilir. Implicit ve explicit expression farkını, Html.Raw'ın ve JavaScript'e '@Model' gömmenin tehlikesini, Json.Serialize'ı, section'ları, _ViewStart/_ViewImports hiyerarşisini ve nested layout'ta kaybolan section hatasını gerçek çıktılarla görüyoruz.
Partial View, View Component ve Razor Component: MVC'de UI Parçalarını Yeniden Kullanmak
Verisi çağıranda olan tekrar eden HTML için partial view, her sayfada görünen ve verisini kendi getiren parça için view component, Blazor'a köprü ya da ileride interaktif olacak parça için Razor component kullan. Partial içinden DbContext çağırınca sorgu sayısının 3'ten 7'ye çıktığını ölçüyor, sepet özeti view component'ini, controller'dan ViewComponent() dönmeyi ve <component> tag helper'ının Static ve ServerPrerendered modlarını görüyoruz.
ASP.NET Core Tag Helper'lar: Yerleşik Tag Helper'lar ve Kendi Tag Helper'ını Yazmak
Tag helper, Razor'daki HTML etiketini sunucuda işleyen ve derleme anında bağlanan bir C# class'ıdır; asp-for tek başına id, name, label, input tipi ve data-val attribute'larını üretir. Yerleşik anchor, form, input, select, environment ve cache tag helper'larının gerçek çıktısını, HTML Helper farkını ve enum attribute'unda @ unutunca kırılan build'i görüp kendi <status-badge> ve yetkiye göre gizlenen <secure-link> tag helper'larımızı yazıyoruz.
MVC ve Razor Pages'te Formlar: Model Binding, Post-Redirect-Get, Antiforgery ve Overposting
MVC controller'larında form tag helper'ı antiforgery token'ı üretir ama doğrulamaz: token'sız curl isteği kitabı kaydetti, AutoValidateAntiforgeryTokenAttribute ile 400 oldu. Post-Redirect-Get ve TempData'yı, fetch ile header'da token göndermeyi, koleksiyon/nested object/checkbox/enum binding'ini ve indeks boşluğunu, entity bind edince stoğu 999 yapan overposting'i ve [Bind]'ın güncellemede veri silen sınırını gerçek isteklerle görüyoruz.
Server-Side ve Client-Side Validation: DataAnnotations, ModelState, Unobtrusive Validation ve Custom Attribute'lar
MVC'de validation iki katmanlı: DataAnnotations ve ModelState sunucuda zorunlu, data-val-* ile çalışan jQuery Unobtrusive Validation yalnız kullanıcı deneyimi. IValidatableObject, AddModelError, [Remote], IClientModelValidator'lı custom attribute ve Türkçe mesajları gerçek tarayıcıda deniyor; Türkçe kültürde "1.5" fiyatının sessizce 15 olarak kaydedildiğini ve type="number" ile __Invariant'ın bunu nasıl düzelttiğini gösteriyoruz.
Razor Pages: PageModel, Handler Method'ları, Page Routing ve Ne Zaman MVC Yerine
Razor Pages'te @page ile dosya kendisi endpoint olur, PageModel'deki OnGetAsync ve OnPostDeleteAsync gibi handler'lar action'ların yerini alır. Bookstore yönetim CRUD'unu yeniden yazıyor; SupportsGet, TempData, AuthorizeFolder ve page filter'ları, eşleşmeyen handler'ın neden 500 verdiğini ve MVC ile dosya düzenini gerçek çıktılarla inceliyoruz.
Static Asset'ler ve UI Altyapısı: MapStaticAssets, Fingerprinting, CSS Isolation ve Client Kütüphaneleri
MapStaticAssets dosyaları build sırasında keşfedip gzip/Brotli ile sıkıştırıyor, fingerprint'li URL'lere bir yıllık immutable cache veriyor. Gerçek header'larla ölçüyor, .NET 10 MVC template'inde MapControllerRoute(...).WithStaticAssets()'in neden hiçbir şey yapmadığını ve düzeltmesini, CSS isolation'daki tag helper tuzağını ve LibMan kullanımını gösteriyoruz.
MVC ve Razor Pages'te Localization: IStringLocalizer, IViewLocalizer, Request Culture ve Türkçe "i" Tuzağı
UseRequestLocalization her istek için kültürü query string, cookie, Accept-Language ya da URL'den seçer; .resx, IViewLocalizer ve DataAnnotations mesajları bu kültürle çevrilir. Bookstore kataloğunu TR/EN yapıyor; tr ile tr-TR farkını, query string'de 25,5'in 255 olmasını, "C" formatı ve Türkçe i tuzağını gerçek çıktılarla gösteriyoruz.
htmx ile Razor Pages: SPA Yazmadan Etkileşimli Arayüz, Partial Yanıtlar ve Antiforgery
htmx ile Razor Pages handler'ları HX-Request header'ına göre tam sayfa ya da yalnız partial döner; canlı arama, sonsuz scroll ve satır içi düzenleme JSON ve SPA olmadan çalışır. Antiforgery token'ını hx-headers ile taşıyor, Vary ve history restore tuzaklarını, htmx 2'nin 4xx davranışını ve htmx 4 farklarını gerçek isteklerle gösteriyoruz.
ASP.NET MVC 5'ten ASP.NET Core MVC'ye Geçiş: Global.asax, Web.config, HtmlHelper ve Bundling'in Karşılıkları
MVC 5'ten ASP.NET Core'a geçişte Global.asax Program.cs'e, Web.config Options'a, HttpModule middleware'e, child action view component'e, bundling MapStaticAssets'e dönüşür; büyük uygulama YARP fallback ile parça parça taşınır. @helper ve @Html.Action'ın gerçek derleme hatalarını, System.Web adapters'taki CS0104 tuzağını ve Upgrade Assistant'ın yerini gösteriyoruz.