İçeriğe atla

ASP.NET Core 6/Razor Sayfaları

Vikikitap, özgür kütüphane

Razor Pages (Razor Sayfaları) MVC benzeri bir web geliştirme framework'udur. MVC'yle aralarındaki farkları bir tabloda vermek daha doğru olacaktır.

MVC Razor Pages
Daha karmaşık Daha basit, daha sezgisel
Daha esnek Daha katı
Büyük ölçekli projelere uygun Büyük ölçekli projelere uygun değil
Controller-action-view tabanlı Sayfa tabanlı
Lojik ve görünüm birbirinden tamamen bağımsız Lojik ve görünüm birbirine daha yakın
Çok fazla seremonisi var Daha hızlı aksiyona girebiliyorsunuz

Bu tablo daha da uzatılabilir. Kısaca Razor Pages eski Web Forms ruhunu yakalamayı amaçlamaktadır. MVC, Web'in arkaplandaki çalışma mantığına daha uygundur, Razor Pages ise kullanıcıların Web'i kullanma şekline daha uygun olduğundan daha sezgiseldir. Sonuçta kullanıcılar web sitelerini birer sayfa yığını olarak görmektedir. Geliştirdiğiniz web sitesini de sayfa sayfa geliştirmek çok da mantıksız görünmüyor.

Razor Pages'ta uygulamamızı sayfa sayfa geliştiririz. Her bir sayfanın bir görünüm, bir de kod kısmı vardır. Sayfanın kod kısmında sayfaya gelen GET taleplerini karşılayacak ve sonucunda görünüm kısmını render'layacak handler metot olduğu gibi POST, PUT, vs. diğer HTTP metotlarını karşılayan handler metotlar da olabilir. Sayfaya talep gelmesi durumunda önce sayfanın kod kısmı, ardından görünüm kısmı çalışır. Görünüm kısmından kod kısmında tanımlanan özelliklere erişilebilir. Razor Pages'ı her controller'ın tek bir action içerdiği, action'ın da yalnızca kendi view'ını renderladığı, view'a model nesnesi olarak da kendini verdiği versiyonu olarak düşünebiliriz. Bu anlatımdan MVC ve Razor Pages'ın birbirine çok benzediği sonucu çıkarabilsek de uygulama geliştirme deneyimi açısından oldukça farklıdırlar. MVC ve Razor Pages beraber aynı projede aynı projenin farklı kısımlarını geliştirmek üzere kullanılabilir. Uygulamanın daha karmaşık ve geliştirmeye açık kısımları MVC ile geliştirilirken ve daha basit, daha stabil ve kendi kendine yeten (self-contained) kısımları Razor Pages ile geliştirilebilir.

Razor Pages'ın etkinleştirilmesi

[değiştir]

Razor Pages, Program.cs dosyasına iki satır kod ekleyerek etkinleştirilebilir:

using Microsoft.EntityFrameworkCore;
using WebApp.Models;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<DataContext>(opts => {
    opts.UseSqlServer(builder.Configuration["ConnectionStrings:ProductConnection"]);
    opts.EnableSensitiveDataLogging(true);
});
builder.Services.AddControllersWithViews();
builder.Services.AddRazorPages();
builder.Services.AddDistributedMemoryCache();
builder.Services.AddSession(options => {
    options.Cookie.IsEssential = true;
});
var app = builder.Build();
app.UseStaticFiles();
app.UseSession();
app.MapControllers();
app.MapDefaultControllerRoute();
app.MapRazorPages();
var context = app.Services.CreateScope().ServiceProvider.GetRequiredService<DataContext>();
SeedData.SeedDatabase(context);
app.Run();

Program.cs dosyamızdaki yeni olan iki satır builder.Services.AddRazorPages(); ve app.MapRazorPages(); satırlarıdır. İlk komut Razor Pages tarafından kullanılan servisi ayağa kaldırır. İkinci komut rota yapılandırmasına Razor Pages'ı ekler.

Razor sayfası oluşturma

[değiştir]

Razor sayfaları proje klasörünün Pages klasöründe oluşturulur. Bu klasörde yeni bir Razor sayfası oluşturun ve ismini Index.cshtml verin, içeriği şöyle olsun:

@page
@model IndexModel
@using Microsoft.AspNetCore.Mvc.RazorPages
@using WebApp.Models;
<!DOCTYPE html>
<html>
<head>
</head>
<body>
	<div>@Model.Product.Name</div>
</body>
</html>
@functions {
	public class IndexModel : PageModel
	{
		private DataContext context;
		public Product Product { get; set; }
		public IndexModel(DataContext ctx)
		{
			context = ctx;
		}
		public async Task OnGetAsync(long id = 1)
		{
			Product = await context.Products.FindAsync(id);
		}
	}
}

@page direktifi ilgili dosyanın bir Razor sayfası olduğunu belirtir. Model olarak kendinin kod kısmı olan IndexModel sınıfını kullanmak zorundadır. Bu sayfaya bir talep geldiğinde önce IndexModel tipinde nesne oluşturulur, nesne oluşturulurken varsa bağımlılıklar çözülür, bu nesne üzerinden OnGetAsync() metodu çalıştırılır. OnGetAsync() metodunun aldığı parametre model binding süreciyle metodun içine enjekte edilir. Metot bu enjekte edilen değeri kullanarak Product özelliğini ayarlamaktadır. Daha sonra görünüm kısmında bu Product özelliğine erişilmekte ve Name özelliğinin değeri ekrana basılmaktadır.

Varsayılan durumda Razor sayfaları Pages klasöründedir. Bu klasördeki dosyalara kullanıcı direkt dosya adını vererek talepte bulunabilir. Örneğin Index.cshtml dosyasını çalıştırmak için http://localhost:5000/Index adresine talepte bulunmak yeterlidir. Eğer dosya Pages klasöründe Deneme alt klasöründe olsaydı dosyaya erişim için gerekli link http://localhost:5000/Deneme/Index olacaktı.