Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
.NET 8'den .NET 11'e MVC ve Razor Pages'te Gelenler
.NET 8 ve 9'un desteği 10 Kasım 2026'da bittiği için MVC ve Razor Pages uygulamalarının hedefi .NET 10. Aynı projeyi net8.0 ve net10.0 ile çalıştırıp cookie auth'un API endpoint'lerinde 302 yerine 401 dönmesini, Minimal API form binding farkını, ASP0026 uyarısını ve RazorComponentResult'u gösteriyor, .NET 11'in MVC maddelerini ve bir yükseltme kontrol listesini veriyoruz.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.