ASP NET Core View Component

View Component bizim için yeni bir terimdir. Asp.Net Core ile hayatımıza giriş yapmıştır. Peki nedir bu view component ve niçin kullanırız ?

View Component

Daha önceden Asp.Net MVC kullananlar bilir oradaki partial view'e benzemektedir ve Partial viewden daha iyidir.(Microsoft diyor ve bence haklılar da)

Birden çok  view'de kullanılabilir ve yeniden kullanılabilir birleşen(component) yazmamızı sağlar.

Asenkron olarak kullanabiliriz.

Url'den ulaşılamaz.(Asp Net MVC de partial view'imizin adını url'den yazarak ulaşılabiliyorduk. Url'den ulaşılabilir olmasını istemediğimiz zamansa ChieldOnly attribute kullanıyorduk ve url çağrıldığında ulaşılamıyordu ve bize hata fırlatıyordu.)

Test edilmesi kolay bir yapısı vardır.

View Component Nerelerde Kullanılır? Örnek olarak;

Dinamik menüler,

Login paneli,

Alışveriş sepeti,

En son yazılar gibi vb. yapılarda kullanabiliriz.

View Component Oluşturma

View Component oluşturmanın birkaç yolu vardır.

1-)ViewComponent attribute kullanarak oluşturabiliriz.

2-)ViewComponent olarak istediğimiz class'ımızın adının sonuna ViewComponent kelimesini ekleyerek.

3-)Kullanacağımız class'ımıza ViewComponent classımızdan katılım alarak.

1-)ViewComponent Attribute ile

[ViewComponent]
public class SonYazilar
{
    public void InvokeAsync()
    {
        ...
    }
}

2-)Classımızın adının sonuna ViewComponent ekleyerek

public class SonYazilarViewComponent
{
    public void InvokeAsync()
    {
        ...
    }
}

3-)ViewComponent class'ından kalıtım alarak

public class SonYazilar : ViewComponent
{
    public async Task<IViewComponentResult> InvokeAsync()
    {
        return View();
    }
}

View Component Dosya Yolu

Projemiz çalışma zamanında view componentleri bu dosya yollarında arar.

  • Views//Components//
  • Views/Shared/Components//

[ViewName] nin varsayılanı Default.cshtml dir.

ViewComponent'i Çağırmak

View componentlerimizi oluşturduk fakat ekranda nasıl göstereceğiz.(çağıracağız)

View componentimizi kullanmak istediğimiz sayfamızda;

 @await Component.InvokeAsync("[ViewComponentName]")
 //parametre alacaksa
 @await Component.InvokeAsync("[ViewComponentName]",[parameters])

Örnek bir uygulama yapalım...

Bunun için modelimizi oluşturalım.

Model

public class Yazi
{
    //Properties
    public int YaziId { get; set; }
    public string YaziBaslik { get; set; }
    public int KategoriId { get; set; }
}

IService interfacemizi yazalım..

public interface IYaziService
{
    ICollection<Yazi> SonYazilar();
    ICollection<Yazi> SonYazilar(int kategoriId ,int adet = 5);
}

YaziService classımızı yazalım..

public class YaziService : IYaziService
{
    static ICollection<Yazi> yazilar;
    public YaziService()
    {
        yazilar = new List<Yazi>()
        {
        new Yazi(){YaziId= 1 ,YaziBaslik = "Yazı 1 ", KategoriId = 1},
        new Yazi(){YaziId= 2 ,YaziBaslik = "Yazı 2 ", KategoriId = 2},
        new Yazi(){YaziId= 3 ,YaziBaslik = "Yazı 3 ", KategoriId = 1},
        new Yazi(){YaziId= 4 ,YaziBaslik = "Yazı 4 ", KategoriId = 3},
        new Yazi(){YaziId= 5 ,YaziBaslik = "Yazı 5 ", KategoriId = 1},
        new Yazi(){YaziId= 6 ,YaziBaslik = "Yazı 6 ", KategoriId = 3},
        };
    }

public ICollection<Yazi> SonYazilar()
{
    return yazilar.OrderByDescending(x => x.YaziId).Take(5).ToList();
}

public ICollection<Yazi> SonYazilar(int kategoriId, int adet = 5)
{
    return yazilar.Where(x=>x.KategoriId == kategoriId).OrderByDescending(x => x.YaziId).Take(adet).ToList();
}
}

Starup.cs de Dependency Injection yapıyoruz.

public void ConfigureServices(IServiceCollection services)
{
    services.AddScoped<IYaziService, YaziService>();
    services.AddMvc();
}

Yeni bir klasör oluştuyoruz ve bu klasör içerisinde kullanacağımız componentler yer alacak.

Sıra geldi, View Componentimizi yazmaya

//ViewComponent classımızdan kalıtım alıyorum
public class SonYazilar : ViewComponent
{
    private readonly IYaziService _yaziService;
    public SonYazilar(IYaziService yaziService)
    {
        _yaziService = yaziService;
    }
    public  IViewComponentResult Invoke(int? kategoriID)
    {
        //parametre alıp almadığını kontrol ediyorum    
        var sonYazilar = kategoriID == null ? _yaziService.SonYazilar() : _yaziService.SonYazilar((int)kategoriID);
        return View(sonYazilar);
    }
}

View Componentimizi de oluşturduk.

Sıra geldi Componentimizin view kısmına;

  • Klasör yolumuz

Defult.cshtml view'in kodlarını yazıyoruz.

Oluşturmuş olduğumuz view componentimizi çağırma işlemini gerçekleştirelim.

Index.cshtml


Ve son hali;

Bildiğim kadarıyla bir şeyler yazmaya çalıştım inşallah birilerinin faydalanması dileğiyle..