# View Component

## View Component;

View componentlar Standart.Netde öğrendiğimiz PartialView lerin gelişmiş versiyonudur deniebilir.&#x20;

Web sitemiz üzerinde hemen hemen her modülde yahut sayfada birebir benzer işlemleri gerçekleştireceksek yahut aynı kodları çalıştırmamız gerekecekse bunun için her sayfa üzerinde hususi çalışmak yerine, bu ihtiyacı partial view yapısı ile global hale getirip lazım olan her noktada ilgili partial view’i çağırarak ihtiyacımıza dönük genelleştirilmiş bir çözüm sağlayabiliyorduk.

Yapısı itibariyle partial view, ihtiyacımızı büyük ölçüde gideren bir özellik olmasına rağmen server işlemlerine ihtiyaç duyulduğu noktada MVC paternine fazladan yük bindirmekte ve lüzumsuz bir maliyet israfına sebebiyet verebilmektedir. Bu maliyet, her server işleminde Controller katmanıyla iletişim kurmak zorunda kalmasından dolayı arz etmektedir. Aşağıdaki görseli incelerseniz eğer en basitinden bir veritabanı işlemi yapmak için bile Controller katmanına erişilmesi gerekilmekte ve o katman üzerinden gerekli birimlere talepte bulunulmak mecburiyetindedir.

![](https://1392128399-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MR9wwvmI8SJVJgLR_0N%2F-MTLKXiURWsjYM0fl7_f%2F-MTLR1__hHdACuUQBotz%2FPV.png?alt=media\&token=a9a7c752-271c-4a9f-adb3-c365c5ad8740)

İşte bu duruma istinaden .NET geliştiricileri Asp.NET Core 2 MVC’de partial view’in bu yükünü ortadan kaldırabilmek için View Component yapılarını geliştirmişlerdir. View component yapıları aşağıdaki görselde olduğu gibi bir işlevselliğe sahiptirler;

![](https://1392128399-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MR9wwvmI8SJVJgLR_0N%2F-MTLKXiURWsjYM0fl7_f%2F-MTLRAZY3X3wEHq1aEtV%2FVC.png?alt=media\&token=6ffb6045-5e12-4a84-982f-6689a89d90c4)

Yani herhangi bir server tabanlı işlemde ya da görselde olduğu gibi ufak bir veritabanı işleminde Controller’a bağlanma gereği duymaksızın direkt olarak ilgili katmana erişim sağlayarak işlemini icra edebilmekte ve gereken sonuçları elde edebilmektedir.

### Projede View Component kullanımı;

![](https://1392128399-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MR9wwvmI8SJVJgLR_0N%2F-MTKxQki3IXKeid_5j5K%2F-MTKz9-tIxGqJfp5MEr-%2Fimage.png?alt=media\&token=bc284cea-2e37-4864-95de-028469fa2e1b)

View Component'lar UI katmanında Models folderının içine ViewComponent folderı olarak açılır.

ViewComponent class'ının oluşturulması ile ilgili 3 yöntem vardır;

```
[ViewComponent]
public class ProfileSummary {...}

public class ProfileSummary:ViewComponent {...}

public class ProfileSummaryViewComponent {...}

```

Kendi projemdeki View Component; profilimin özet bilgilerini gösteren dinamik bir görünümdür.Öncelikle ViewComponent'ımı oluşturdum.&#x20;

![](https://1392128399-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MR9wwvmI8SJVJgLR_0N%2F-MTKxQki3IXKeid_5j5K%2F-MTL-cyv5zOdTzr2j57f%2Fimage.png?alt=media\&token=20c34b49-2618-48c9-ae6d-8fb5abdb7fd2)

GetByUserName methodu daha önceden IAppUserServis içerisinde oluşturduğum ve AppUserServis içerisinde implement ettiğim bir method. Bunun için ViewCpomnentıma IAppuserService interfaceimi inject ettim.

Daha sonra ViewComponentlerın View kısmı için için View/Shared/ProfileSummary folderının içine Default.cshtml olarak açtım. Bunun sebebi; projemiz çalışma zamanında ViewComponentı uygulamak için&#x20;

* Views//Components//
* Views/Shared/Components//  adresleri aramasıdır. (\[ViewName] nin varsayılanı **Default.cshtml** dir.)

![](https://1392128399-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MR9wwvmI8SJVJgLR_0N%2F-MTKxQki3IXKeid_5j5K%2F-MTL3Ein8-QEt0MF5_Rd%2Fimage.png?alt=media\&token=ccd25cac-3e82-4320-bdd5-e7444d8874ff)

Profile Sumarry'nin View Component'ının view kısmında Default.cshtml olarak oluşturduk şimdi Bu Default.cshtml içerisinde farklı bir ViemComponentı çağıralım. Bu nun için 2 yöntem vardır.

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

Ben kendi projemde parametre alacağım için aşağıdaki şekilde kullandım. Burada görüleceği gibi ProfileSummary Default.cshtml ı içerisinde FollowUser.cs view componentını çağırdım.

![](https://1392128399-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MR9wwvmI8SJVJgLR_0N%2F-MTKxQki3IXKeid_5j5K%2F-MTL31L4Yha_4gnXC_zl%2Fimage.png?alt=media\&token=57ad3b40-8abb-4224-9b85-64beeb759547)

Bunun devamında kendi projemde oluşturduğum \_LeftSideBarPartial'ı ve içeirsindeki controlleri açıklayacağım.

![](https://1392128399-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MR9wwvmI8SJVJgLR_0N%2F-MTL9mNfeZNK3EeKLC95%2F-MTLHP_CV5js_7m_YBK1%2Fimage.png?alt=media\&token=0ecbb102-caa9-47e7-95ed-30d8868d0ec3)

LeftSideBar partialview inde Home, Details ve Settings olarak 3 control ekledim bu kontrollerden Details ve settings kısmına sadece üye kullanıcıların erişimi için bir if kontrolü yazdım

![](https://1392128399-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MR9wwvmI8SJVJgLR_0N%2F-MTKxQki3IXKeid_5j5K%2F-MTL6LbHZPg1M-R4gJwn%2Fimage.png?alt=media\&token=ba93970f-7271-4509-8b9c-ecd6c24d3a7b)

![](https://1392128399-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MR9wwvmI8SJVJgLR_0N%2F-MTKxQki3IXKeid_5j5K%2F-MTL6PM2CTm4x14_VaUW%2Fimage.png?alt=media\&token=604ddaf0-026d-4406-9e00-6fec3c15fc58)

Şuan login olan kullanıcı Profile controlünü tıkladığında yukarıda görüleceği gibi Profile folderındaki details   .cshtml ine yönlendiriliyor. Onun içini incelediğimizdede görüyoruz ki ; doğrudan buraya ProfileSummary ViewComponıntı çağırılmış.

![](https://1392128399-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MR9wwvmI8SJVJgLR_0N%2F-MTL9mNfeZNK3EeKLC95%2F-MTLEijKjIwnBR-WUlQt%2Fimage.png?alt=media\&token=6105b5fc-3ac8-4f74-9feb-026f435ecf1b)

Peki yukarıda anlattığımız neydi; ProfileSummaryVC çağırıldığında proje View Componentı uygulamak için " Views/Shared/Components// " adresinden aramsını yapıp ProfileSummary folderındaki Derfault.cshtml e ulaştı. Bu sayfayı tekrar inceleyelim. sayfanın üst kısmında bir foroğraf olacağı altında name ve UserName yazacağı görülecektir.Bunların altında bir if sorgusu ile eğer farklı bir kişinin profiline bakıyorsak FollowUserViewComponın kullanılması eğer kendi profilimize bakıyorsak settings controlü olduğunu göreceğiz. Ve devamındada Tweets Followers Following sayıları görülecektir.

![](https://1392128399-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MR9wwvmI8SJVJgLR_0N%2F-MTL9mNfeZNK3EeKLC95%2F-MTLG9MMFOJMPijH6fUO%2Fimage.png?alt=media\&token=b6fa828c-beff-4c77-b50e-728357717810)

