0% found this document useful (0 votes)
113 views258 pages

Web Programlama.

web programlama.

Uploaded by

drivehocam
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
113 views258 pages

Web Programlama.

web programlama.

Uploaded by

drivehocam
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

İSTANBUL ÜNİVERSİTESİ

AÇIK VE UZAKTAN EĞİTİM FAKÜLTESİ

WEB PROGRAMLAMA 2
DR. ÖĞR. ÜYESİ CAN YÜZKOLLAR
WEB PROGRAMLAMA 2
DR. ÖĞR. ÜYESİ CAN YÜZKOLLAR

Genel Yayın Yönetmeni


Prof. Dr. Levent Şahin

Kapak Tasarım
AUZEF

Grafik Tasarımı
AUZEF

Sayfa Tasarımı
AUZEF

ISBN: 978-605-07-0831-8
2022
Copyright � İstanbul Üniversitesi Açık ve Uzaktan Eğitim Fakültesi
5846 sayılı Yasa’ya göre eserin tüm yayın, çeviri ve iktibas hakları Açık ve Uzaktan Eğitim
Fakültesi’ne aittir.

II
ÖN SÖZ
İnternet ve web teknolojilerinde yaşanan gelişmeler ile beraber, bu
gelişmelerin günlük hayata yansıması kaçınılmaz olmuş, internet ve web
teknolojilerine bağlı birçok araç insanların günlük hayatlarının bir parçası haline
gelmiştir. Bu teknolojiler her gün milyonlarca insan tarafından sosyalleşme,
alışveriş, eğitim, bilgi edinme vb. alanlarda sıklıkla kullanılmaktadır. Bu noktada
geçmişte geliştirilen ve aynı uygulamanın farklı işletim sistemleri (Windows,
Mac OS, Linux ) ve mimariler için farklı sürümlerinin kodlanması gereken
uygulamalar; yerini internet üzerinden erişilebilen ve kullanıcı tarayıcısında
çalıştırılan web uygulamalarına bırakmıştır.
Web uygulamaları belirli bir sunucuya bağlanıp bu sunucunda alınan ve
sunucuya gönderilen bilgiler eşliğinde istemci tarafında bir tarayıcı ile çalıştırılan
yazılım uygulamalarıdır. Temel olarak istemci tarafı ve sunucu tarafı olmak
üzere iki ayrı odağa ayrılan web uygulamalarında kitap boyunca sunucu taraflı
odak üzerinde durulacaktır.
Bu kitapta web ve internet teknolojileri hakkında kısa bir bilgilendirme
yapılmıştır. Daha sonra web programlama konsepti dahilinde kullanılan
temel yaklaşımlar piyasada bulunan tutarlı, kararlı ve zengin özelliklere sahip
çerçevelerden biri olan [Link] Core kullanılarak örneklendirilmiştir. Aynı
zamanda web tabanlı uygulamaların nasıl geliştirileceğini öğrenmek isteyen
geliştiriciler için temel düzeyde bilgilendirme örneklerle açıklanmıştır. Bu
çerçevede okuyucuların temel Html, css ve javascript bilgilerinin yanı sıra C#
diline aşinalıkları yararlarına olacaktır.

DR. ÖĞR. ÜYESİ CAN YÜZKOLLAR


Editör

III
IV
WEB PROGRAMLAMA 2

İçindekiler

ÖN SÖZ III

1. INTERNET VE WEB TEKNOLOJİLERİ TEMEL KAVRAMLAR 1


1.1. İnternet ve Web Kavramları 2
1.2. Web Framework (Web Çerçeveleri) 5
1.3. Back-End (Arka yüz) ve Front-End (Ön yüz) Yazılım Geliştirme 6
1.4. FrontEnd-Client Side Programalama (İstemci Taraflı-Ön Yüz Programalama) 6
1.5. Server Side- BackEnd Programalama (Sunucu Taraflı –Arka yüz programlama) 9
1.6. .Net Framework 11
1.7. .Net Core 13
1.7.1. .Net Core Avantajları 15
1.8. [Link] Core 16
1.9. Software Architectural Patterns (Yazılım Mimari Modelleri-Desenleri) 17
Bu Bölümde Ne Öğrendik? 23
Kaynakça 24
Bölüm Soruları 25

2. MVC YAPISI VE [Link] CORE İLE MVC KULLANIMI 27


2.1. Giriş 28
2.2. Kurulum 28
2.3. [Link] Core ile Yeni Proje Oluşturma 29
2.4. [Link] Core MVC Proje Yapısı 33
2.5. MVC(Model View Controller) 35
2.5.1. Model Bileşeni 35
2.5.2. View Bileşeni 35
2.5.3. Conroller Bileşeni 36
2.6. Routing(Yönlendirme) 36
2.7. MVC Yaşam Döngüsü 37
2.8. [Link] CORE’da Controller 37
2.9. [Link] CORE’da View 41
2.10. [Link] CORE’da Model 44
Bu Bölümde Ne Öğrendik? 46
Kaynakça 47
Bölüm Soruları 48

3. LAYOUT KAVRAMI VE RAZOR VİEW ENGİNE (RAZOR GÖRÜNÜM MOTORU) 51


3.1 Layout Kavramı 52
3.2. Razor View Engine(Razor Görünüm Motoru) 54
3.2.1. Razor Söz dizimi 55
3.3. Koşullu İfadeler 56

V
3.4. Döngüler 59
Bu Bölümde Ne Öğrendik? 63
Kaynakça 64
Bölüm Soruları 65

4. FORM İŞLEMLERİ VE MODEL BAĞLAMA 69


4.1. Form 70
4.2. Örnek Form Uygulaması 73
4.3. Model Binding (Model Bağlama) 78
Bu Bölümde Ne Öğrendik? 81
Kaynakça 82
Bölüm Soruları 83

5. DURUM YÖNETİMİ VE VIEW’E VERİ AKTARIMI 89


5.1. Durum Yönetimi (State Management) 90
5.1.1. İstemci Taraflı Durum Yönetimi (Client-Based State Management) 90
5.1.2. Sunucu Taraflı Durum Yönetimi (Server-Based State Management) 92
5.2. Örnek bir Session ve Cookie Uygulaması 94
5.3. View’e Veri Aktarımı 99
5.4. ViewBag 99
5.5. ViewData 101
5.6. TempData 102
5.7. Model Verilerinin Aktarılması-View Model 104
Bu Bölümde Ne Öğrendik? 106
Kaynakça 107
Bölüm Soruları 108

6. ETİKET YARDIMCILARI (TAG HELPER) 111


6.1. Tag Helper (Etiket Yardımcıları) 112
6.2. Tag Helper Avantajları 112
6.3. Anchor Tag Helper (Bağlantı Etiketi Yardımcısı) 113
6.4. Form Tag Helper (Form Etiket Yardımcısı) 113
6.5. Input Tag Helper 115
6.6. Label Tag Helper 116
6.7. Textarea Tag Helper 118
6.8. Select Tag Helper 119
6.9. Hazır Razor View Şablonları Oluşturma(Scaffolding Razor View) 120
Bu Bölümde Ne Öğrendik? 125
Kaynakça 126
Bölüm Soruları 127

7. MODEL DOĞRULAMA (MODEL VALIDATION) 131


7.1. Giriş 132
7.2. Model Doğrulama (Model Validation) 133

VI
WEB PROGRAMLAMA 2

7.2.1. Model Doğrulama Kullanımı 135


7.2.2. İstemci Taraflı Model Doğrulama 135
7.2.3. Sunucu Taraflı Model Doğrulama 138
7.3. Örnek Uygulama 139
Bu Bölümde Ne Öğrendik? 154
Kaynakça 155
Bölüm Soruları 156

8. LINQ - LANGUAGE INTEGRATED QUERY (DİLE ENTEGRE SORGU) 159


8.1. Giriş 160
8.2. LINQ Sorgularının Yürütülmesi 162
8.2.1. Ertelenmiş Sorgu Yürütme (Deferred Query Execution) 162
8.2.2. Anlık Sorgu Yürütme (Deferred Query Execution) 163
8.3. LINQ Sorguları 164
8.4. Sık Kullanılan LINQ Sorgu Operatör ve Metotları 164
8.4.1. Where Operatörü 165
8.4.2. OrderBy- OrderByDescending Operatörü 166
8.4.3. Group By Operatörü 167
8.4.4. Select Operatörü 167
8.4.5. Contains-Any-All Metotları 168
8.4.6. Count Metodu 168
8.4.7. Max- Min- Sum-Avarage Metotları 168
8.4.8. First- FirstOrDefault Metotları 169
Bu Bölümde Ne Öğrendik? 171
Kaynakça 172
Bölüm Soruları 173

9. ENTITY FRAMEWORK CORE 177


9.1. Giriş 178
9.2. ORM (Object Relational Mapping) 178
9.3. Entity Framework Core (EF Core) 180
9.4. Entity Framework Core’u Projeye Ekleme 182
9.5. Data Annotations ve EF Core’da Data Annotations Kullanımı 185
9.6. Code-First Yaklaşımı ile Proje Oluşturma – Örnek Uygulama 187
9.6.1 Veri Modeli Oluşturma 188
9.6.2. DbContext Oluşturma 190
9.6.3. Migration Oluşturma 192
9.6.4. Model Güncelleme 214
Bu Bölümde Ne Öğrendik? 216
Kaynakça 217
Bölüm Soruları 218

VII
10. WEB API 221
10.1. Web API 222
10.2. SOAP ve Rest Kavramları 224
10.3. API’ler için Veri Formatları 225
10.4. HTTP Protokolü ve Rest API 226
10.5. HTTP Durum Kodları 228
10.6. HTTP Metodları ve CRUD İşlemleri 229
10.7. [Link] Core Web API 231
Bu Bölümde Ne Öğrendik? 246
Kaynakça 247
Bölüm Soruları 248

VIII
1. INTERNET VE WEB TEKNOLOJİLERİ TEMEL
KAVRAMLAR

İnternet'in başarısının sırrı,


yeni hizmetlere açık olmasıdır.
Edward Felten
Ders videosunu izlemek için
QR kodu taratın.

Kazanımlar Birlikte Düşünelim


• Internet ve web kavramları nedir sorusunun yanıtını
öğrenebilir. 1. Internet ve Web Nedir?
• Internet ve web’in gelişimi hakkında temel bilgiler edinebilir.
• BackEnd (Arka yüz) ve FrontEnd (Ön yüz) yazılım geliştirme 2. Web Framework nedir?
kavramlarını bilebilir.
• .Net ve .Net Core Hakkında genel bilgiler edinebilir. 3. Front-end ve Back-end kavram-
• Yazılım Mimari Modelleri hakkında temel bilgiler edinebilir. ları nelerdir?

Başlamadan Önce 4. Web Framewok nedir?


Web teknolojileri, internet üzerinden farklı türdeki cihazlar
arasındaki iletişim sürecinde kullanılan çeşitli araç ve tekniklerdir. 5. Yazılım mimari modeli nedir?
Mobil cihazlarımızın, araçlarımızın ve bir çok ev cihazının kesintisiz
olarak internete bağlanabildiği günümüz dünyasında web projeleri 6. Sık kullanılan yazılım mimari
gerçekleştirmek için yeni bir başlangıç yapanların bu konuda önemli modelleri nelerdir?
olan bazı kavramları ve araçları öğrenmesi son derece önemlidir.

1
1.1. İnternet ve Web Kavramları
Dünya genelinde pek çok insanın yaşantısı internet ve web teknolojilerinin
kullanımı ile beraber değişiklik göstermiştir. Bu değişimin çeşitli olumsuz
yanları olsa da genel olarak değişim olumlu yönde gerçekleşmiştir. İnsanların
birbiriyle olan iletişimi kolaylaşırken, insan hayatında birçok kolaylık ve yenilik
de beraberinde gelmiştir. İnsanlar bu teknolojileri günlük hayatta sosyal ağlar
ile iletişim, kamu hizmetleri, alışveriş, ticaret, eğitim, bilgi edinme, eğlence vb.
kullanım amaçları ile sıklıkla kullanmaktadır. Ayrıca internet ve web teknolojileri
insalara duygu ve düşüncelerini kolaylıkla ifade edebilme ortamı da sağlamaktadır.
Dünya çapında birbirine bağlı cihazların oluşturduğu küresel bir ağ sistemi
olan internetin veriyi bir yerden başka bir yere taşımak gibi basit bir görevi
Anahtar Kavram vardır. World Wide Web (www) olarak da adlandırılan Web, internet üzerinden
Protokoller: Makinelerin ve erişebileceğimiz metin sayfaları, dijital fotoğraflar, müzik dosyaları, videolar ve
uygulama programlarının bilgi
alışverişinde bulunmasına izin animasyonlar gibi internet üzerinden erişilen bilgi topluluğudur. Bu bilgi topluluğu
veren, mesaj biçimleri ve prose- ile iletişim HTTP protokolü ile genel olarak web tarayıcıları ile gerçekleştirilir.
dürler için kurallar kümesidir. Alıcı
Kökeni 1960’lı yıllarda Amerika’da araştırmalara ve haberleşmenin TCP/
ana bilgisayarın mesajı anlayabil-
mesi için iletişimde yer alan her IP((Transmission Control Protocol/Internet Protocol) protokolü ile gerçekleştiği
makine tarafından bu kurallara internet; 1990’larda ulusal ağın yaygınlaşması ile insan hayatında önemli bir
uyulmalıdır.
yer almıştır. İnternet ve internet teknolojilerinin gelişim süreci aşağıda kısaca
özetlenmiştir:

• 1962 yılında ve MIT’deki Leonard Kleinrock, verilerin paketler olarak


aktarılmasını sağlayan teknoloji (packet switching theory), üzerine ilk
makaleyi yayımladı. Aynı zamanda, J.C.R. MIT’den Licklider, insanların
herhangi bir yerden bilgiye erişmelerini sağlayacak olan “Galaktik Ağ”ı
tanımlayan bir dizi not yazdı.
• 1965 yılında, MIT araştırmacısı Lawrence G. Roberts, Thomas Merrill ile
birlikte, Massachusetts’deki TX-2 bilgisayarını California’daki Q-32’ye
düşük hızlı bir telefon hattıyla askeri bir proje olan ARPANET kapsamında
bağladı.
• 1980 IBM küçük işletmeler için kişisel bir bilgisayar tanıttı. Microsoft, tüm
“IBM uyumlu” bilgisayarların aynı programları çalıştırmasına izin veren,
Windows adlı yazılım geliştirdi.
• 1980’lerin sonlarında, Tim Berners-Lee CERN’de farklı bilgisayarları kullanan
kişilerin araştırmalarını paylaşmanın kolay bir yolunu aradı.
• Tim Berners Lee, ASCII (American Standard Code for Information
Interchange)’yi bilgisayarların haberleşmesinde bir kural olarak kullandı
ve bunu HTTP (HyperText Transfer Protocol) olarak adlandırdı.
• Tim Berners Lee ikinci kural olarak, tüm CERN bilgisayarlarının HTML
(HyperText Markup Language) adlı ortak bir dilde yazılmış dosyaları değiş
tokuş etmesini sağladı. Planladığı HTML ile etiked adı verilen özel kodlarla
metinleri yapılandırdı.

2
WEB PROGRAMLAMA 2

• 1993: Marc Andreessen, daha sonra Netscape ve Mozilla’ya dönüşen ilk


kullanıcı dostu web tarayıcısı Mosaic’i yazdı.
• 1994: İnsanlar kısa sürede hızla büyüyen World Wide Web’de gezinmek için
yardıma ihtiyaç duyduklarını anladılar. WebCrawler ve Yahoo gibi arama
motorları geliştirildi.
• 1995: Amazon, eBay’ın kurulmasıyla beraber e-ticaret düzgün bir şekilde
Marc Andreessen (1971-)
başladı.
1993’te ilk grafik temelli tarayıcı
• 1996: ICQ ile birlikte İnternet’teki ilk kullanıcı dostu anında mesajlaşma olan Mosaic’i geliştirmitir. Daha
sistemi geliştirildi. sonra Netscape tarayıcısını da
geliştiren ve şirket kurucularından
• 1997: Jorn Barger ilk blogu yayımladı (web günlüğü). olan Andreessen, halihazırda
• 1998: Larry Page ve Sergey Brin, Google adında bir arama motoru geliştirdi. da birçok teknoloji şirketinin
(Facebook, HP gibi) yönetim kurulu
• 1999: Kevin Ashton, sadece bilgisayarların değil, gündelik nesnelerin
üyeliğini yapmaktadır.
internet’in bir parçası olabileceği (Nesnelerin İnterneti) fikrini ortaya koydu.
• 2003: Hemen hemen dünyadaki her ülke internet’e bağlandı
• 2004: Harvard öğrencisi Mark Zuckerberg, insanları arkadaşlarıyla buluşturan,
kullanımı kolay bir web sitesi olan Facebook ile sosyal ağlarda devrim
yarattı.
• 2006: Jack Dorsey ve Evan Williams, insanların 140 karakterlik mesajlarıyla
düşüncelerini ve gözlemlerini paylaşabildikleri basit bir “mikroblog” sitesi
olan Twitter’ı duyurdular.
• 2007: Iphone ile mobile internet kavramı yaygınlaştı.
• 2013: Fotoğraf paylaşım sitesi instagram 400 milyon kullanıcıya ulaştı.
• 2016: Google kişisel asistan programı olan Google Asistan’ı tanıttı

3
Şekil 1

Web Teknolojilerinde Yaşanan Gelişmeler

1990 - Web 1.0


İlk aşamayı ifade eder. Web siteleri ve web
kullanıcıları arasında yalnızca sınırlı bir etkile-
şim vardır. Kullanıcıların yorum yapma ve geri
bildirim olmadan sadece bilgi alabildiği bir
ortam sunulmuştur.

2000 - Web 2.0


Katılımcı web olarak da adlandırılır. Katılımı,
işbirliğini ve bilgi paylaşımını teşvik eder. Face-
book, Youtube, Wiki, Flickr vb. örnek olarak
verilebilir. İstemci tarafında Ajax, JavaScript
frameworklerinde ki gelişmeler, sunucu tafasın-
da ise Perl, PHP, Python, Ruby gibi dillerin yanı
sıra Enterprise Java (J2EE) ve [Link]
Framework gelişmeler Web 2.0 ı oluşturdu.

2010 - Web 3.0


Semantik Web veya okuma-yazma-yürütme
olarak da adlandırılır. Web ‘in geleceğine atıfta
bulunan yaklaşıma sahiptir. İnsanlar tarafından
katılımcı web ile oluşturulan veriler kişiye özgü
olarak bilgisayarlar tarafından Yapay Zekâ ve
Makine Öğrenimi teknikleriyle yorumlanabil-
mektedir. Bu yaklaşım ile her bir kullanıcının
belirli bir ihtiyacına göre uyarlanmış özel içerik
akıllı bir şekilde oluşturulup doğrudan her bir
kullanıcıya özel olarak dağıtılabilir. Örnek
olarak Apple'ın Siri'si, Google'ın Bulut API’si
verilebilir.

Şekil 1. Web Teknolojilerinde Yaşanan Gelişmeler

Tarihsel olarak internet ve web teknolojilerinde yaşanan gelişmeler ile beraber


internet üzerinde yer alan uygulamaların kullanımları ve özellikleri de değişiklik
göstermiştir. Web’in gelişiminde, Web 1.0 ilk aşamayı ifade eder. (1990 ‘lı yıllar)
Tim Berners-Lee tarafından “salt okunur web” olarak da adlandırılan kullanıcı
etkileşimin yer almadığı bir ortamdır. Web siteleri ve web kullanıcıları arasında
yalnızca sınırlı bir etkileşim vardır. Web1.0 ile kullanıcıların yorum yapma ve geri
bildirim olmadan sadece bilgi alabildiği bir ortam sunulmuştur.
Web 2.0 (2000’li yıllar ve halen devam) Sosyal Web olarak da adlandırılan,
web kullanıcıları ile siteler arasındaki etkileşimi kolaylaştıran ve kullanıcıların
diğer kullanıcılarla iletişim kurmasına olanak tanıyan bir yapı sunar. Katılımcı
web olarak da adlandırılır. Web 2.0; katılımı, iş birliğini ve bilgi paylaşımını teşvik

4
WEB PROGRAMLAMA 2

eder. Web 2.0 uygulamalarına örnek olarak Facebook, Youtube, Wiki, Flickr vb.
verilebilir. Bu noktada bu yapının oluşmasında yaşanan teknolojik yenilikler de
etkili olmuştur. Bu yenilikler istemci tarafında Ajax, JavaScript frameworklerinde
ki gelişmeler, sunucu tarafında ise Perl, PHP, Python, Ruby gibi dillerin yanı sıra
Enterprise Java (J2EE) ve [Link] Framework örnek olarak verilebilir. Film Önerisi
Semantik Web veya okuma-yazma-yürütme olarak da adlandırılan Web 3.0, Yönetmenliğini David Fincher’ın
2010 yılında yönetmenliğini yaptığı
web’in geleceğine atıfta bulunan yaklaşıma sahiptir (2010 ve günümüz). İnsanlar Sosyal Ağ adlı filmdir. Facebook’un
tarafından katılımcı web ile oluşturulan veriler kişiye özgü olarak bilgisayarlar kurucusu Mark Zuckerberg ve arka-
daşlarının öyküsü beyaz perdeye
tarafından Yapay Zekâ ve Makine Öğrenimi teknikleriyle yorumlanabilmektedir. taşınmıştır.
Bu yaklaşım ile her bir kullanıcının belirli bir ihtiyacına göre uyarlanmış özel içerik
akıllı bir şekilde oluşturulup doğrudan her bir kullanıcıya özel olarak dağıtılabilir.
Örnek olarak Apple’ın Siri’si, Google’ın Bulut API’si verilebilir.
Web teknolojilerinde yaşanan tüm bu gelişmeler ile beraber web projelerindeki
geliştirme sürecinin hızlı ve problemsiz yürütülmesi yazılım geliştiriciler, proje
yöneticileri ve firmalar açısından son derece önemlidir. Kullanıcı iletişiminin
son derece yoğun olduğu günümüz uygulamalarında uygulamaya ait isteklerin
dinamik bir yapıda olması, değişikliklerin ve güncellemelerin oluşmasına
sebebiyet vermekte, zaman içerisinde bu değişikliklerin gerçekleşmesi zorunlu
bir hal almaktadır. Bu noktada sürdürebilirlik önemli bir kavram olarak ortaya
çıkmaktadır. Uygulamaların kalite ve performansının da etkin olabilmesi yine bu
sürecin doğru yönetilmesi ile alakalıdır. Bu sebeple yazılım geliştirme ortamının
seçimi; kalite, performans ve sürdürebilirlik noktasında önem arz etmektedir.
Kitap boyunca da üzerinde durulacak olan [Link] CORE; HTML, CSS ve
JavaScript kullanarak web siteleri ve web uygulamaları oluşturmaya yönelik
piyasada bulunan kararlı ve tutarlı ücretsiz bir web framework’üdür.

1.2. Web Framework (Web Çerçeveleri)


Web uygulamalarından beklentiler ile beraber ihtiyacı karşılayacak
teknolojinin karmaşıklığı da arttığından, çerçeveler web geliştirmenin önemli bir
parçası haline gelmiştir. Web çerçeveleri, yazılım ve web geliştiricileri için hazır
olan bir dizi kaynak ve araç anlamına gelir. Web çerçeveleri, çok çeşitli önceden
yazılmış bileşenler, kod parçacıkları ve uygulama şablonları sunar. Hazır olarak
sunulan tüm bu bileşenlerin yeniden yazılabileceğini varsaysak da kullanıma
hazır olan bu tip yaklaşımı terk edip yeniden efor sarf ederek kodlama yapmak
zahmetli ve zaman alıcı bir işlem olacaktır. Bu çerçeveler, web geliştiricilerine
web uygulamaları, web hizmetleri ve web sitelerini kolayca oluşturma ve yönetme
yeteneği verir. Bu nedenle, dünya çapında binlerce geliştirici tarafından onaylanan
çerçeveleri kullanmak, zengin ve etkileşimli web uygulamaları geliştirmek için
mantıklı bir yaklaşımdır.
Web çerçevelerinin çoğu açık kaynaklı ve ücretsizdir. Uygulamaların kolay
ve hızlı oluşturmasına olanak sağlarlar. Bu sayede geliştiriciler çok sayıda
tekrarlayan koddan sakınmış olurlar ve verimli bir şekilde projelerini üretirler.

5
Bir web çerçevesi gelişmiş güvenlik özellikleriyle birlikte gelir ve sorunlar tespit
edildiğinde gerekli yamalar yayımlanır. Ayrıca web çerçevelerinde, geliştiricilerin
çerçeveyi çeşitli veri tabanlarına kolay bir şekilde bağlamasına olanak sağlayan
entegrasyon özelliği mevcuttur.

1.3. Back-End (Arka yüz) ve Front-End (Ön yüz) Yazılım


Geliştirme
Ön yüz ve Arka yüz, web geliştirmede kullanılan en popüler iki terimdir. Bir
web Çizim 1
uygulamasının bir arka yüzü (sunucu tarafı) ve bir ön yüzü (istemci tarafı)
vardır, Web projelerinin işlevselliğini geliştirmek için her iki taraf da diğeriyle
etkin bir şekilde iletişim kurmalı ve çalışmalıdır.

1Sunucudan bir tarayıcıya 2 3


bir site yüklenir.
İstemci tarafı komut Veritabanına bir çağrı
THE BACK END
5
dosyaları tarayıcıda gerektiğinde JavaScript Sunucu tarafı komut
çalışır ve istekleri sunucuya ve AJAX istekleri arka uca dosyaları verileri işler,
geri arama yapmadan işler. gönderir. ardından siteyi günceller -
açılır menüleri doldurur,
ürünleri bir sayfaya yükler,
kullanıcı profilini günceller
İstek ve daha fazlasını yapar.
İnternet
Tepki
Database
Servers

4
Arka uç sunucu tarafı komut
Bir kullanıcının tarayıcılarda dosyaları isteği işler, ihtiyaç
gördüğü her şey HTML, CSS ve duyduklarını veritabanından
JavaScript’in bir karışımıdır. alır ve geri gönderir.
Duyarlı (Responsive) ön-uç tasarımı
(front-end design), bir sitenin kullanıcının
cihazına uyum sağlamasına olanak tanır.

Çizim 1. Backend ve FrontEnd Programlama

1.4. FrontEnd-Client Side Programalama (İstemci Taraflı-Ön


Yüz Programalama)
Ön yüz, uygulamanızın son kullanıcıya sunulan kısmıdır. Bir web sayfası
isteğinde bulunduğumuzda temel anlamında bize sunulan HTML, CSS ve
JavaScript’in, kullandığınız web tarayıcı tarafından yorumlanmış halidir. İstemci
tarafı geliştirme olarak da bilinen ön yüz web geliştirme, temelde; bir web sitesi
veya web uygulaması için HTML, CSS ve JavaScript üretme işlemidir. Web siteleri,
web uygulamaları veya mobil uygulamalar açıldığında tarayıcı ekranlarında
görülen her şeyin yapısı, tasarımı, davranışı ve içeriği ön yüz geliştiriciler
tarafından tasarlanır. Kullanıcının doğrudan etkileşimde bulunduğu bir web
sitesinin parçası, ön yüz ya da istemci tarafı olarak adlandırılır.
 HTML (Hypertext Markup Language), Köprü Metni İşaretleme Dili
anlamına gelir. Bir biçimlendirme dili kullanarak web sayfalarının ön uç kısmını

6
WEB PROGRAMLAMA 2

tasarlamak için kullanılır. HTML, Köprü Metni ve İşaretleme dilinin birleşimidir.


Köprü metni, web sayfaları arasındaki bağlantıyı tanımlar. İşaretleme dili, web
sayfalarının yapısını tanımlayan etiket içindeki metin belgelerini tanımlamak için
kullanılır.

 CSS (Cascading Style Sheets) Basamaklı Stil Şablonu, web sitelerinin


kullanıcılar tarafından ekranda görünen bileşenleri şekillendirmeye,
renklendirmeye, boyutlandırmaya ve konumlandırmaya yarar. Kısaca web
sayfalarına çeşitli stiller uygulamanıza olanak tanır. HTML web sayfasının
iskeletini oluşturmak için kullanılırken, CSS ise onu görsel olarak düzenlemek
için kullanılmaktadır.

 JavaScript, web sayfalarına dinamiklik kazandırmak, kullanıcının


tarayıcı ile etkileşimini arttırmak, tarayıcının kontrol edilmesi, asenkron bir
şekilde sunucu ile iletişime geçilmesi ve web sayfası içeriğinin değiştirilmesi gibi
işlemlerde kullanılan betik bir dildir.

7
Ön yüzde kullanılan çerçeveler bir iskele görevi görürler. Html, Css ve
javascript’in kolay ve efektif bir şekilde kullanılmasına olanak sağlarlar. Her
popüler çerçeve genel olarak karşılaşılan sorunları çözerken kendi tasarım
felsefesini sunar. Bootstrap ve SemanticUI gib çerçeveler görsel tasarıma odaklanıp
sürdürülebilir Html ve Css üzerine yoğunlaşırken, Vue, React ve Angular gibiler
ise, verileri manipüle edip veri akışını yapılandırmaya çalışırlar.
Yukarıda bahsettiklerimiz haricinde ön yüzde yazılımcılar tarafından tercih
edilen jQuery, Emberjs, Backbonejs gibi çerçeveler de mevcuttur. Linkedin
üzerinde 2021 yılının mart ayında iş ilanları incelendiğinde iş ilanlarında aranan
niteliklere göre tercih edilen ön yüz frameworkleri aşağıda verilmiştir.

8
WEB PROGRAMLAMA 2

Görsel 1. Linkedin 2021 yılının mart ayında ön yüz frameworkleri iş


ilanları sayısı

1.5. Server Side- BackEnd Programalama


(Sunucu Taraflı –Arka yüz programlama)
Web 1.0 olarak adlandırılan web ile beraber statik web sayfaları yaygındı.
İnsanlar sadece istedikleri bilgileri internet ortamına koyuyorlar ve bilgiler
değişiklik yapılmadığı sürece orada kalıyordu. Şirketler için gerçekleşen değişikleri
çabuk bir şekilde uygulamaya koymak, çeşitli ihtiyaçlar dâhilinde güncellenen
verileri web ortamında sunmak dinamik programlama yaklaşımıyla beraber
mümkün olmaya başladı. Web 2.0 ile insanların yorum yapabildikleri, fikirlerini
beyan edebildikleri katılımcı web ile beraber işin içerisindeki dinamizm daha da
artmış oldu. Bu dinamizm o dönemde yaygın olarak kullanılan ve bir web sunucusu
üzerinde çalışan Php, Asp gibi web programlama dilleri ile gerçekleşmekteydi. Şu
an için web programlama dillerinin popülerliği değişse de dinamik olarak web
projelerinin geliştirilmesinde sunucu taraflı programlama halen kullanılmaktadır.
Sunucu taraflı programlamada kullanılan popüler programlama dilleri Java, C#,
Python, Php, [Link] şeklinde örneklenebilir. Bir istemci sunucudan bir içerik
talep ettiğinde, uygun programlama dilinin yardımıyla web sunucusu tarafından
uygun komutlar işletilir. Sunucu tarafında sık yapılan işlemlerden biri, ihtiyaç
duyulan verileri bir veri tabanından çekmek ve bunları web projesinde uygun
biçimde kullanmaktır. Son kullanıcı bir web uygulamasına erişip bir istekte
bulunduğunda, gelen istek sunucu tarafından karşılanmakta ve burada işletilen

9
kodlar neticesinde kullanıcıya temel olarak HTML, CSS, Javascript şeklinde bir
dönüş sağlanmaktadır. Yani kullanıcı sunucu üzerinde işletilen kodları göremez
ve onlara erişemez. Kullanıcılar; arka yüz tasarımcıları tarafından geliştirilen
parçalara ve özelliklere, bir ön yüz uygulaması aracılığıyla dolaylı olarak erişir.
İpucu
Web API konusuna 10. bölümde yer API yazma, kütüphane oluşturma ve kullanıcı arabirimleri sistem bileşenleriyle
verilecektir. çalışma gibi etkinlikler de arka yüzde yer alır.
Sunucu tarafında web çerçeveleri sıklıkla kullanılır. Sunucu taraflı web
çerçeveleri, web uygulamalarını çalıştırmak için gereken günlük işlemleri
gerçekleştirirken aşağıda verilen özellikleri de barındırdılar.

Şekil 2. Sunucu Taraflı Web Çerçevelerinin Özellikleri

Sunucu taraflı kullanılan web çerçevelerine ise .Net, Net Core, Laravel, Django,
Spring, CodeIgniter örnek olarak verilebilir. Bu web çerçevelerin her biri [Link]
Core (C#), Flask (Python), Laravel (Php), Spring (Java) vb. gibi bir programlama
dili ile beraber kullanılır. 2021 Mart ayında Linkedin üzerindeki iş ilanlarının
nitelikleri arka yüz çerçeveleri yönünde tercih sebebi olarak incelendiğinde elde
edilen sonuçlar aşağıda yer almaktadır.

10
WEB PROGRAMLAMA 2

Görsel 2. Linkedin 2021 yılının mart ayında arka yüz frameworkleri iş


ilanları sayısı

Genelde ön yüz, arka yüz ayrı ayrı uzmanlaşması gereken konulardır. Piyasada
sıklıkla duyulan frontend geliştirici, backend geliştirici gibi kavramlar uygulama
gerçekleştirirken yazılımcıların sunucu ve istemci olarak hangi taraf (arka yüz,
ön yüz) ile ilgilendiği ve dolayısı ile hangi teknolojisi ile uzmanlaştığına göre
belirlenmektedir. Bunun yanı sıra bir web uygulamasında hem ön hem de arka
yüz ile yazılım geliştirebilecek donanıma sahip uzmanlar da full-stack geliştirici
olarak adlandırılmaktadır.

1.6. .Net Framework


.Net Framework (yazılım çatısı-çerçevesi) Microsoft tarafından geliştirilmiş
bir yazılım geliştirme platformudur. .Net tarafından desteklenen programlama
dilleri ile masaüstü uygulamaları, web uygulamaları, web servisleri ve mobil
uygulamalar tek bir çatı altında gerçekleşebilmektedir. .NET dil bağımsızlığı ve
birlikte çalışabilirlik sağladığından, yazılım geliştiricilerin geliştirildikleri dilden
bağımsız olarak diğer .Net uygulamaları ve bileşenleriyle etkileşim kurmasına
olanak sağlamaktadır. Net çerçevesiyle uyumlu aralarında [Link] ve C#’ında
olduğu 25’ten fazla aktif dil vardır. Bu platform ile geliştirilen tüm uygulamalar
windows işletim sistemi üzerinde çalıştırılabilmektedir.
.NET Framework’te çeşitli koleksiyonlar, sınıflar ve işlemleri barından
temel programlama işlemlerini kolayca gerçekleştirmeyi sağlamak amacıyla
programcının hizmetine sunulan, önceden yazılmış birçok faydalı temel türler ve

11
sınıflar bulunmaktadır. Dilden bağımsız olarak çalışan temel sınıf kütüphanesi
(System, [Link], [Link] vb.) .Net çatısı altındaki tüm diller
tarafından kullanılmaktadır. Bu sınıfların kolaylıkla hatırlanıp kullanılması için
benzer amaçlara yönelik olarak mantıksal bir organizasyon dâhilinde işlemlerin
bir arada tanımlanması isim alanı (namespace) olarak adlandırılmaktadır. (C#
dilindeki isim alanları (namespace) yapısı, Java’da paketler(package) yapısına
denk gelmektedir.) Örneğin [Link] isim alanı ile dosyalara ve dizinlere erişmek
için gerekli sınıflar tanımlanmışken; System isim alanı, içerisinde Byte, Char,
Array, Int32 ve String gibi tüm uygulamalar tarafından kullanılan temel veri
türlerini temsil eden sınıfları içerir. İsim alanları .Net platformunda C# ile ilgili
koda using anahtar kelimesi aşağıdaki gibi eklenir.
using System;
İlk sürümü Şubat 2002’de piyasaya sürülen .Net platformu çeşitli iyileştirmeler
ve yenilikler geçirerek 2019 yılına kadar farklı versiyonlar ile kaşımıza çıkmış, 2019
yılında ise son sürümü olan 4.8 versiyonu yayımanmıştır. Microsoft bu tariften
sonra ilk sürümünü 2016 yılında mimarisini değiştirilerek piyasaya sürdüğü .Net
Core ile yoluna devam etmiştir.

12
WEB PROGRAMLAMA 2

Tablo 1. Net Framework Sürümleri ve Özellikleri

Yıl .NET CLR Visual Studio Yeni Özellikler


Versiyon Versiyon
2002 1.0 1.0 Visual Studio .NET 2002 Başlangıç Sürümü –CLR, CTS, FCL teknolojileri
Web Uygulamarı için OOP desteği

2003 1.1 1.1 Visual Studio .NET 2003 Mobil cihaz geliştirme için [Link] Control
desteği, Oracle veri tabanı ve ODBC veri tabanı
bağlantısı için [Link] desteği . IP6 desteği
2005 2.0 2.0 Visual Studio 2005 Yeni CLR 2.0, [Link] & [Link] Geliştir-
mesi, Generics Türler, ve 64 bit desteği
2006 3.0 2.0 Visual Studio 2005 Windows Presentation Foundation (WPF),
Windows Communication Foundation (WCF),
Windows Workflow Foundation (WWF) tanı-
tıldı.
2007 3.5 2.0 Visual Studio 2008 AJAX desteği Language Integrated Query
(LINQ), HashSet koleksiyonları, WCF ve WF
entegrasyonu
2010 4.0 4.0 Visual Studio 2010 Yeni CLR 4.0, Task Parallel Library (TPL), Ma-
naged Extensibility Framework (MEF) eklendi
2012 4.5 4.0 Visual Studio 2012 Async desteği eklendi, bazı temel sınıflar geliş-
tirildi.
2013 4.5.1 4.0 Visual Studio 2013 Performans ve hata ayıklama iyileştirmeleri, oto-
matik bağlama yeniden yönlendirme desteği
2014 4.5.2 4.0 Visual Studio 2013 [Link] API geliştirmeleri, Windows Forms
denetimleri için Sistem DPI desteği, Windows
için olay izleme (ETW) hata ayıklama iyileştir-
meleri eklendi.
2015 4.6 4.0 Visual Studio 2015 [Link] geliştirmeleri, yeni 64-bit JIT derleyi-
cisi, Assembly Loader iyileştirmeleri, Garbage
Collector geliştirmeleri vb. eklendi.
2017 4.7 4.0 Visual Studio 2017 Gelişmiş şifreleme desteği, performans ve güve-
nilirlik iyileştirmeleri
2019 4.8 4.0 Visual Studio 2019 JIT iyileştirmeleri, Güncellenmiş ZLib, FIPS
iyileştirmeleri

1.7. .Net Core


NET Core, Microsoft tarafından geliştirilen ücretsiz, açık kaynaklı ve platform
bağımsız (Windows, macOS ve Linux işletim sistemlerinde çalışabilen) bir yapıda
uygulama geliştirmeye olanak sağlayan .Net Framework’ün yeni bir sürümüdür.
NET Core, mobil, masaüstü, web, bulut, IoT, makine öğrenimi, mikro hizmetler,
oyun vb. gibi farklı türde uygulamalar oluşturmak için kullanılabilir. C#, F#, ve
Visual Basic gibi programlama dillerini destekler. .NET Core 1.0 adıyla Haziran

13
2016’da yayımlanana ilk sürümünden sonra Core 1.1, Core 2.0, Core 2.1, Core 2.2,
Core 3.0, Core 3.1 sürümleri yayımlanmıştır. Bu sürümden sonra Net Framework
versiyonları ile karıştırılmaması adına yeni sürüm Net 5 adını almıştır. Aşağıda
.Net Core sürüm yayımlanma tarihleri verilmiştir.

Tablo 2. Net Core Sürümleri

Versiyon Yayın Tarihi


.NET 5 Kasım 2020
.NET Core 3.1 Aralık 2019
.NET Core 3.0 Eylül 2019
.NET Core 2.2 Aralık 2018
.NET Core 2.1 Mayıs 2018
.NET Core 2.0 Ağustos 2017
.NET Core 1.1 Kasım 2016
.NET Core 1.0 Haziran 2016

Microssoft Net 5 ile tek bir temel sınıf kitaplığı ile her tür .Net uygulamasını
(.NET Framework, .NET Core, Xamarin, Mono, .NET Standard vb.)oluşturmak için
birleşik bir platform oluşturmuştur.

Görsel 3. Net 5 Birleşik Platform

14
WEB PROGRAMLAMA 2

1.7.1. .Net Core Avantajları

Şekil 3. .Net Core Avantajları

• Çapraz Platform (Cross-Platform)


Net Core’un platform bağımsız özelliğinden dolayı uygulamamız tüm
platformlarda (Windows, Linux ve MacOS) sorunsuz bir şekilde çalışabilir.
Bildiğimiz gibi .NET Framework kullanarak başlanan bir proje windows
platformlarına uygun olarak tasarlanmaktaydı. Böyle bir projeye başlandığında
çeşitli sebeplerle (lisanslama ve altyapı maliyetleri vb.) başka bir platforma
geçiş yapmaya karar vermek çoğu zaman çok farklı bir planlamayı beraberinde
getirecektir. Proje .Net Core ile başlandığında kolay bir şekilde başka platformlara
geçiş yapılabilir durumdadır. Örneğin, web uygulamaları windows hizmetleri
olarak Apache ile Linux’ta, IIS’de (Microsoft’a özel web sunucusu) barındırılabilir.

• Açık Kaynak Kod Esnekliği


Microsoft tarafından GitHub üzerinde, kaynak kodları açık bir şekilde yer
almaktadır. Dileyen yazılımcılar kodları inceleyebilirler. Ayrıca yeni kütüphane
ve paketler projelere kolay bir şekilde eklenip kullanılabilir, paketler incelenerek
gerekli uygun değişiklikler yapılabilir.

• Performans
NET Core NET Framework’e göre hafif, bellek kullanımı düşüktür. Sistem
kaynaklarını verimli bir şekilde kullanır. Firmalar Core’a geçerek sunucu
maliyetlerini düşürebilmektedirler. Ayrıca günümüz uygulamalarının çoğu

15
cloud (bulut) ortamlarında barındırıldığından ve Core bulut uygulamaları
desteklediğinden gereksiz harcamalar önlenmiş olur.
• Mikroservis Mimarisi Uyumu
Mikroservisler küçük, modüler iş hizmetlerinden oluşan yazılım
uygulamalarıdır. Her hizmet benzersiz bir süreç çalıştırabilir, bağımsız olarak
dağıtılabilir ve farklı programlama uygulamalarında (NET Framework,Java vb.)
oluşturulabilir. Böylelikle her biri için farklı teknolojiler kullanan mikroservisler
oluşturulabilir. Bu da projenin daha hızlı dağıtılmasına, hata ya da güncelleme
anında tüm proje yerine ilgili serviste işlem yapılarak tüm sistem de kesinti
olmadan durumun atlatılmasına olanak sağlar. .Net Core, mikroservis mimarisine
uyumludur.

1.8. [Link] Core


[Link], Microsoft tarafından .NET Framework’un bir parçası olarak 2002
yılında yayımlandı. O zamana kadar ASP (Active Server Page) olarak bilinen
Windows platformlarında çalışan dinamik script bir dil mevcuttu. Son yıllarda
[Link], web uygulamaları geliştirme için piyasada bulunan en tutarlı, kararlı ve
zengin özelliklere sahip çerçevelerden biri haline geldi.
.NET Framework’te web uygulamaları geliştirmek için [Link] Framework’ü
altında Web Forms, [Link] MVC, Web API ve Signal R gibi farklı seçenekler
mevcuttu. .NET Core’da iki farklı programlama modeli ([Link] Core MVC ve API)
birleştirilmiş olarak sunulmaktadır. Bunun yanı sıra gRPC(Remote Procedure
Call) desteği ile birlikte Signal R de devam etmektedir. Web Form, .Net Core da yer
almazken bunun yerine Blazor ve Razor yer almaktadır.

16
WEB PROGRAMLAMA 2
Çizim 2

.NET Framework .NET Core .NET 5.0

ASP. NET Framework [Link] Core [Link] Core 5.0

ASP. NET MVC


[Link] Core MVC [Link] MVC
[Link] Core API Web API
Web API

Signal R Signal R Signal R

Web Forms Blazor Blazor

Razor Pages Razor Pages

gRPC gRPC

Çizim 2. Net Framework- .Net Core- .Net 5 Bileşenleri

[Link] Core, uygulamanıza farklı özellikler kazandırmak için birçok


kütüphane bulunur. Yapılandırma dosyalarını okuma gibi bazı kütüphaneler
hemen hemen tüm uygulamalarda kullanılırken, Google, Facebook gibi üçüncü
parti bir uygulama üzerinden kimlik denetimi yapılmak istendiğinde ilgili
kütüphane projeye eklenmelidir. Özetle kütüphaneler ihtiyaç halinde projeye
eklenir. [Link] Core’da kullanılabilecek kütüphanelerin bazıları GitHub’da,
[Link] adresinde bulunabilir.
Web uygulamalarına dinamiklik kazandırmak için bir programlama dili
kullanılmalıdır. .Net Core frameworkunde kullanılan programlama dilleri
C#, [Link] ya da F# olabilir. .Net Core ekosisteminin temel bileşeni olan ve
web projelerini gerçekleştirebileceğimiz bir çerçeve sunan [Link] Core ile
çoğu uygulama basit, güçlü bir nesne yönelimli programlama dili olan C# ile
gerçekleştirilmektedir. Son sürümü C# 9.0 adıyla Eylül 2020 de yayımlanan bu
programlama dili ile web uygulamalarının yanı sıra masaüstü uygulamaları ve
oyun programları da geliştirilmektedir (okuyucuların temel düzeyde C# bilgisi
yararlarına olacaktır).

1.9. Software Architectural Patterns (Yazılım Mimari


Modelleri-Desenleri)
Geliştiriciler yazılımlarını gerçekleştirirken benzer sorunlarla pek çok kez
karşılaşırlar. Her seferinde karşılaşılan sorunlara birçok geliştirici tarafından

17
benzer şekilde çözüm üretildiğinde ve bu çözüm yolunun problemi iyi çözdüğü
genel kabul gördüğünde bu çözüm yöntemi bir kalıp haline gelir. Mimari model,
Okuma Önerisi çeşitli sistemlerin tasarım yapılarını ve yeniden kullanılabilecekleri yazılım
Kaya, A. ve Bulut, E. (2015). ögelerini yakalar, belirli bir bağlamda yazılım mimarisinde yaygın olarak ortaya
Tasarım Desenleri ve Mimarileri.
Ankara: Pusula Yayıncılık. çıkan bir soruna genel, yeniden kullanılabilir bir çözümdür. Mimari desenler,
yazılım tasarım desenine benzer ancak daha geniş bir kapsamı vardır. Yazılım
mimarisi, yazılım programının yapısal bileşimini ve ögeler arasındaki etkileşimleri
açıklar. Model ayrıca alt sistemler arasındaki ilişkileri düzenlemek için kuralları
ve yönergeleri de açıklar (istemci ve sunucu arasındaki ilişki). Mimari modeller
uygulamanın her yerine odaklanıp geniş alana yayılan probleme çözüm üretirken,
tasarım desenleri belirli bir kapsamdaki problemi çözmeye odaklanmıştır. Çok sık
kullanılan mimari modeller aşağıda listelenmiştir.

Şekil 4. Yazılım Mimari Modelleri-Desenleri

 Model-view-controller (MVC) pattern: MVC modeline ait mimari


bileşenler, bir uygulamanın geliştirme aşamasındaki farklı yönlerini ele almak
için tasarlanmıştır. Bu model uygulamayı model, view (görünüm) ve controller

18
WEB PROGRAMLAMA 2

(denetleyici) olmak üzere 3 farklı mantıksal bölüme ayırır. Sunum katmanını


iş mantığından ayırmaya yarar. Günümüzde pek çok mobil ve web uygulama
tarafından kullanılmaktadır.

 Layered pattern: Bu model, her biri belirli bir soyutlama düzeyinde olan
alt görev gruplarına ayrıştırılabilen programları yapılandırmak için kullanılabilir.
Bu alt görevlerin her biri bir katman (layer) ile temsil edilir. Her katman (layer), bir
sonraki üst katmana hizmet sağlar. Uygulama tipine bağlı olarak katman sayısı
belirlenebilir. Genel olarak kullanılan dört katman Presentation layer (UI layer),
Application layer (service layer),Business logic layer (domain layer),Data access
layer (persistence layer)’dır.

 Client-Server pattern: Birden çok istemciye hizmet sağlayan bir sunucu ve


birden çok istemciden oluşur. Sunucu istemci isteklerini dinler, hizmet talebinde
bulunan istemcilerin ilgili hizmetleri sağlar (örneğin bir istemcinin uzak veri
tabanı sunucusuna erişimi).

19
 Master-Slave pattern: Master-Slave modeli genellikle aynı problemin
birçok örneğinin çözülmesi gereken çok iş parçacıklı uygulamalar için kullanılır.
Master bileşen, işi tüm slave bileşenler arasında dağıtır bu bileşenlerden gelen
sonuçları toplayarak nihai sonucu hesaplar.

 Peer-to-Peer pattern: Geleneksel olarak istemcinin istek gönderip


sunucun bu isteği karşılaması yaklaşımından farklı olarak eş olarak adlandırılan
her bir sistem, ağın parçası olan diğer eşlerden hizmet alır ve verir. Bu modele
örnek olarak Domain Name System (DNS), BitTorrent verilebilir.

 Event-Bus pattern: Olay kaynağı, olay dinleyicisi, kanal ve olay veri


yolu olmak üzere 4 ana bileşeni vardır. Kaynaklar, olay veri yolundaki belirli
kanallara mesajlar yayımlar. Dinleyiciler, daha önce abone oldukları bir kanalda
yayımlanan mesajlar hakkında bilgilendirilir. Mesajların üretilmesi ve bildirilmesi
asenkrondur, tüm olay dinleyicileri mesajı alana kadar beklemez.
20
WEB PROGRAMLAMA 2

 Blackboard pattern: Blackboard mimarisi, ortak bir veri yapısı üzerinde iş


birliği içinde çalışan bağımsız programlardan oluşur. Burada her program iş birliği
içinde, birbirinden bağımsız olarak genel bir görevi çözmek için uzmanlaşmıştır.
Birbirlerini çağırmak yerine sistemin belirlediği yön esas alınarak ilerleme
kaydedilir.

 Interpreter pattern: Bu model, özel bir dilde yazılmış programları


yorumlayan bir bileşen tasarlamak için kullanılır. Temel olarak, belirli bir
dilde yazılmış cümleler veya ifadeler olarak bilinen program satırlarının nasıl
değerlendirileceğini belirtir. Temel fikir, dilin her sembolü için bir sınıfa sahip
olmaktır. Uzman sistemler gibi kural tabanlı sistemler, javascript gibi web script
diller bu modele örnektir.

21
 Broker pattern: Broker modeli, uzaktan hizmet çağrılarıyla etkileşime
giren ayrılmış bileşenlerle dağıtılmış yazılım sistemlerini yapılandırmak için
kullanılabilir Broker bileşeni, bileşenler arasındaki iletişimin koordinasyonundan
sorumludur.

Kitap boyunca örnekler Model-view-controller (MVC) modeli üzerinde


gerçekleştirilecek olup bu model ileriki bölümlerde daha ayrıntılı ele alınacaktır.

22
WEB PROGRAMLAMA 2

Bu Bölümde Ne Öğrendik?

* İnternet, dünya çapında birbirine bağlı cihazların oluşturduğu küresel bir ağ sistemidir.

* Web, internet üzerinden erişebileceğimiz metin sayfaları, dijital fotoğraflar, müzik dosyaları,
videolar ve animasyonlar gibi internet üzerinden erişilen bilgi topluluğudur.

* Web framework’leri uygulamaların kolay ve hızlı oluşturmasına olanak sağlayan ve bu sayede geliştiricilerin
çok sayıda tekrarlayan koddan sakınması ile daha verimli kodlar yazmanlarına imkân tanıyan web
geliştirmenin önemli bir parçasıdır.

* Web geliştirmede kullanıcının iletişimde bulunduğu görsel ögelere odaklanan taraf front-end
(ön yüz); sunucu tarafı, web uygulaması mantığı ve entegrasyonunu ele alan taraf back-end
(arka yüz) olarak ifade edilmektedir.

* [Link] Core, Web uygulamaları geliştirmede .Net Core’un bir parçası olan; tutarlı, kararlı ve zengin
özelliklere sahip bir web framework’üdür.

* Yazılım mimarisi, yazılım programının yapısal bileşimini ve ögeler arasındaki etkileşimleri, alt
sistemler arasındaki ilişkileri düzenlemek için kuralları ve yönergeleri açıklar.

23
Kaynakça
[Link] [Link]
meworks-2021/
[Link]
[Link]
[Link]
front-end-framework/
mework-version-history/
[Link] Core in Action Second Edıtıon Andrew Lock
[Link]
dotnet-core [Link]
IM0203_03.pdf/30dae517-691e-b3c7-22ed-a-
[Link]
55ad27726d6
den-ve-ne-zaman-kullanilmali
[Link]
[Link]
ns-software-architecture
osing-core-framework-server
[Link]
[Link]
re-architectural-patterns-in-a-nutshell-a0b47a1e9013
[Link]
[Link]
[Link] col-tcpip-protocols
meworks/
[Link]
[Link]
[Link]
[Link]
[Link]
web-3-0-with-their-difference/

24
WEB PROGRAMLAMA 2

Bölüm Soruları
1) Internette haberleşme hangi protokol ile gerçekleşir?
a) TENET b) TELNET c) WUNET d) WORLDNET e) ARPANET

2) Internet’in ortaya çıkmasında hangi proje etkili olmuştur?


a) TENET b) TELNET c) WUNET d) WORLDNET e) ARPANET

3) Aşağıdakilerden hangisi istemci tarafında kullanılan bir teknolojidir?


a) Asp b) Php c) Java d) Javascrıpt e) Perl

4) Katılımcı Web olarak da adlandırılan yapı web evriminin hangi aşamasını


ifade eder ?
a) Web 1.0 b) Web 2.0 c) Web 3.0 d) Web 4.0 e) Web 5.0

5) Aşağıdakilerden hangisi .Net Core’un bir sürümü değildir?


a) .NET Core 1.1 b) .NET Core 2.1 c) . NET Core 4.1
d) .NET Core 3.1 e) .Net 5

6) [Link] Core ile uygulama gerçekleştirilirken hangi programlama dili


kullanılır?
a) C# b) Php c) Asp d) C e) C++

7) HTML açılımı aşağıdakilerden hangi seçenekte doğru verilmiştir?


a) Hypertext Machine Language
b) Hyper Transfer Language
c) Hypertext Markup Link
d) Hypertext Markup Language
e) Hyper Machine Language

8) Sunucu tarafında kullanılan web framework’leri (çerçeveleri) aşağıdaki


özelliklerinden hangilerine sahip olabilir?
I. URL yönlendirme
II. Form yönetimi ve doğrulama
III. Object–relational mapping (ORM) aracılığıyla veri tabanı bağlantısı
yapılandırma
a) Yalnız I
b) Yalnız II
c) I ve II
d) II ve III
e) I,II ve III

25
9) Web 3.0 için aşağıdaki seçeneklerden hangisi/hangileri yanlıştır?
I. Semantic Web olarak da adlandırılır.
II. Static bir web ortamı olarak tanımlanabilir.
III. Kişiye özgüdür.
a) Yalnız I
b) Yalnız II
c) I ve II
d) II ve III
e) I, II ve III

10) Aşağıdaki mimari modellerden hangisi birden çok istemciye hizmet


sağlayan bir sunucu ve birden çok istemciden oluşur?
a) Model-view-controller(MVC) pattern
b) Broker pattern
c) Blackboard pattern
d) Client-server pattern
e) Layered pattern

Cevaplar
1-c 2-e 3-d 4-b 5-c 6-a 7-d 8-e 9-b 10-d

26
2. MVC YAPISI VE [Link] CORE İLE MVC
KULLANIMI

Yazılım, sanat ve mühendislik arasında harika bir


kombinasyondur.
Bill Gates
Ders videosunu izlemek için
QR kodu taratın.

Kazanımlar Birlikte Düşünelim


• .Net Core çerçevesini tanır ve kurulum yapabilir.
• Yeni bir [Link] Core MVC projesi oluşturabilir. 1. .Net Core çerçevesi kurulumu
• [Link] Core MVC proje yapısını öğrenebilir. nasıl gerçekleştirilebilir?
• Model-View-Controller (MVC) modeline ait bileşenleri bilebilir.
• Asp Net Core’da MVC bileşenlerini tanımlayıp kullanabilir. 2. [Link] Core ile yeni bir proje
nasıl oluşturlur?
Başlamadan Önce
Önceki bölümde internet ve web teknolojileri ile ilgili temel 3. [Link] Core MVC proje yapısı
kavramlar aktarılmış ve son olarak yazılım mimari modelleri konusu nasıldır?
ele alınmıştı. Bu bölümde ise MVC yapısı ve [Link] Core ile bu yapının
nasıl kullanılabileceği incelenecektir. Büyük ölçekli ve karmaşık 4. MVC modelinde her bir bileşene
yapıdaki web uygulamalarında iyi organize edilmiş ve sürdürülebilir kod ait sorumluluklar nelerdir?
yazmak önemli bir konudur. MVC modeli web geliştirme için en yaygın
kullanılan yazılım mimari modellerinden biridir. Pek çok programlama 5. MVC yaşam döngüsü nasıl ger-
diliyle beraber uzun yıllardır başarılı bir şekilde kullanılmaktadır. çekleşir?
MVC modelinin Model, View ve Controller olan mimari bileşenleri, bir
uygulamanın farklı yönlerini ele almak için tasarlanmıştır. MVC modeline
ait her bir bileşenin farklı bir amacı vardır. Bu sayede anlaşılması daha
kolay, sürdürülebilir ve yeniden kullanıma uygun kodlar üretilmiş olur. 27
2.1. Giriş
Microsoft, [Link] Core uygulamaları geliştirmek için Visual Studio ve
Visual Studio Code gibi çeşitli araçlar sunar. Visual Studio, GUI (Grafik Kullanıcı
Arayüzü), web uygulamaları, konsol uygulamaları, mobil uygulamalar, bulut ve
web hizmetleri vb. geliştirmek için Entegre Geliştirme Ortamıdır (IDE). Visual
Studio Code ise Visual Studio’nun gelişmiş özelliklerine sahip olmamakla birlikte
ona daha hafif bir alternatiftir.

2.2. Kurulum
Microsoft, öğrenme (ticari olmayan) amacıyla ücretsiz bir sürüm olan Visual
Studio Community’i sağlamıştır. Tüm sürümlere ait kurulumu gerçekleştirmek
için [Link] adresinde yer alan
kurulum dosyasını indirmek gereklidir.

Görsel 4. Visual studio kurulum seçenekleri

Visual Studio kurulumunu başlatmak için kurulum dosyası çalıştırılır.


Bu noktadan sonra; belirli diller veya platformlarda çalışmaya olanak
sağlayan, iş yüklerine göre gruplandırılmış yükleme seçeneği sunulur.

Görsel 5. Platform seçimi


28
WEB PROGRAMLAMA 2

Bağımsız bileşenler bölümünde bulunan veri tabanı işlemleri için


kullanacağımız SQL Server Express 2016 LocalDB seçeneği seçili olmalıdır.

Görsel 6. SQL Server Express LocalDB seçimi

Gerekli seçimler yapılıp yükleme işlemi tamamlandığında bilgisayar yeniden


başlatılmalıdır.

2.3. [Link] Core ile Yeni Proje Oluşturma


Visual Studio, farklı türde uygulamalar geliştirmek için; Razor Pages, MVC
ve Web Api uygulamaları gibi birçok [Link] Core şablonu içerir. Bir önceki
bölümde de belirttiğimiz gibi kitap boyunca uygulamalarımızı MVC üzerinde
gerçekleştireceğiz.
Visual Studio’yu açıp yeni proje oluştur dedikten sonra Görsel [Link] de yer alan
[Link] CORE Web Application seçeneği seçilerek devam edilmelidir (Bu işlem
açık bir visual uygulamasında File > New >Project ile de gerçekleştirilebilir).

29
Görsel 7. Yeni Proje Oluşturma Penceresi

Bir sonraki pencerede Project Name (Proje adı), Location (projenin nereye
kaydedileceği) ve Solution (farklı projeler arasındaki ilişkileri belirler) belirlenir.

Görsel 8. Projenin yapılandırılması

Proje yapılandırmasından sonra oluşturulan web projesine ait şablon seçim


ekranı gelmektedir. Bu pencere ile uygulamamıza ait şablon(template) seçimi
gerçekleştiririz.

30
WEB PROGRAMLAMA 2

Görsel 9. Web projesi şablon seçimi

Bu seçim ekranında Model-View-Contoller ile web uygulaması geliştirmek


için ilgili şablon seçimi gerçekleştirilir. Create tuşu ile de projemiz oluşturulur.
Projemiz oluşturulduğunda ise aşağıda gösterildiği gibi Visual Studio 2019’da yeni
bir [Link] Core MVC web projesi oluşturacaktır.

Görsel 10. Proje oluşturulduğunda oluşan giriş sayfası

31
Oluşturulan uygulama Visual Studio’da, araç çubuğunda IIS Express’in
yanındaki yeşil okla veya F5 tuşuna basarak kolayca çalıştırılabilir. Visual
Anahtar Kavram
Tarayıcı: Bir web tarayıcısı, World Studio otomatik olarak bilgisayarınızda var olan tarayıcıda bir web sayfası
Wide Web'e veya yerel bir web açacaktır. İstendiği takdirde web sayfasını açacağı tarayıcı değiştirilebilir. Proje
sitesine erişmek için kullanılan çalıştırıldığında, IIS (Internet Information Services) Express varsayılan olarak
uygulama yazılımıdır. Bir kullanıcı
belirli bir web sitesinden bir web rastgele bir port numarası (bağlantı noktası) seçer.
sayfası istediğinde bulunduğunda,
web tarayıcısı bir web sunucusun-
dan gerekli içeriği alır ve ardından
sayfayı kullanıcının cihazında
görüntüler. . Chrome, Edge, Fire-
fox, Safari ve Opera yaygın olarak
kullanılan tarayıcılardır.

Görsel 11. [Link] Core proje ana sayfası

IIS, Microsoft tarafından Windows sistemlerde çalışmak üzere geliştirilmiş bir


web sunucudur. IIS Express ise microsoft tarafından geliştiriciler için optimize
edilmiş hafif, bağımsız bir IIS sürümüdür. Görsel 12. de yer alan url de gözüken
44350 port numarası istenildiği takdirde Project > “Projeİsmi” Properties Menüsü
seçilerek solda yer alan Debug kısmından değiştirilebilir.

32
WEB PROGRAMLAMA 2

Görsel 12. Uygulamanın port numarasını değiştirme

2.4. [Link] Core MVC Proje Yapısı


Yukarıda açıklanan adımlar tamamladıktan sonra, içinde bir proje bulunan
yeni bir solution elde edilecektir. Bu projenin yapısı aşağıdakine benzer şekilde
olacaktır.

Okuma Önerisi
[Link] ve MVC Temelli Esnek
(Responsive) Web Uygulaması
konulu makaleyi çevrim içi olarak
aşağıdaki bağlantıdan okuyabi-
lirsiniz.

Görsel 13. [Link] Core MVC Projec Yapısı

Bir [Link] Core Mvc projesi oluşturulduğunda <ProjeAdı>.csproj isminde bir


proje dosyası oluşacaktır. Bu proje dosyası proje klasörleri, NuGet paket referansları
vb. ile ayarları içerir. Proje ismi üzerine sağ tıklanıp Edit Projet File seçeneği ile

33
proje dosyasının içeriği görüntülenebilir. Örneğin EntityFrameworkCore paketi
eklenen proje için bu dosyanın içeriği aşağıdakine benzer şekilde olacaktır.

• Connected Services: Bir projeyi harici bir hizmete (Azure Storage vb.)
bağlamak için gereken adımları otomatikleştirmeyi amaçlar.
• Dependencies: Projenin bağlı olduğu tüm paketleri veya diğer projeleri
içerir. Bu klasörün altında da çeşitli klasörler yer alır.
o Analizer: Kod çözümleyicileri, kod yazarken görünen özel hata mesajları ve
uyarılar ile bunları temizlemenize yardımcı olacak otomatik kod düzeltmeleri için
kullanılır. Yazılan kodun herhangi bir kısmı kurallardan biri için geçerli değilse,
proje oluştururken bir uyarı veya hata mesajı döndürür.
o Framework: Bu klasörde, projenin bağlı olduğu çerçevelerin bir listesi
tutulur. Burada listelenen tüm çerçeveler, uygulamanın çalışacağı sunucuda da
yüklü olmalıdır.
o Packages: Projeye eklenen tüm NuGet paketlerini listeler. Bu paketlerden
herhangi biri diğer paketlere bağlıysa, bunlar otomatik olarak kurulacak ve kök
düzeyindeki paketlerin alt düğümleri olarak listelenecektir. Yüklü paketler burada
da kaldırılabilir.
• Properties: İçinde yer alan “[Link]” dosyası ile derleme ve
hata ayıklama zamanı vb. proje davranışları tanımlanmıştır. Projede yapılan
özellik değişiminde bu dosya otomatik olarak yapılandırılır.
• wwwroot: Bu klasör, web uygulamalarına ait CSS, JavaScript, resimler ve
simgeler gibi tüm statik dosyalarını içerir.
• [Link]: Bu dosya, web uygulamanızın giriş noktası olan “Main” adlı
bir statik metotla “Program” sınıfını tanımlar. Bir web sunucusu oluşturmak ve
istekleri dinlemeye başlamak için gereken tüm temel başlatma kodlarını içerir.
• [Link]: Startup sınıfı, proje oluşturulduğunda sınıfa eklenen iki metot
ile bir uygulamanın gerektirdiği kurulum ayarlarının çoğunun gerçekleştirildiği
yerdir. Bu sınıf tüm başlatma görevlerini gerçekleştirir. (Veri tabanının ilk değerler
ile ayarlanması, migration vb.) Web uygulamasının istek ve cevapları nasıl ele
alacağına dair middleware’ları tanımlar. HTTP request ve response’ların nasıl ele
alınacağını belirleyen yapıya middleware denir. Middleware uygulama kanalına
(application pipeline) eklenen yazılım bileşenleridir (software components).
Uygulamamıza gelen her request sırasıyla burada tanımlanan middlewareların

34
WEB PROGRAMLAMA 2

üzerinden geçer. (örneğin kimlik doğrulaması var mı, loglama olacak mı vb.)
Routing işlemleri de burada eklenir. Çeşitli servislerin dependency injection ile
Configure metoduna enjekte edilmesine müsaade eder.

2.5. MVC(Model View Controller)


Model-View-Controller (MVC) mimari modeli, bir uygulamayı model,
görünüm (View) ve denetleyici (Controller) olmak üzere üç ana bileşene ayırır.
Sorumlulukları ayrı her bir bileşen birbirini etkilemeden birbirinden bağımsız
olarak çalışır. Böylelikle proje boyutu arttıkça projenin yönetimi ve kontrolü daha
kolay bir şekilde sağlanır. Aynı zamanda eş zamanlı olarak projenin ilerlemesi de
gerçekleşmiş olur.

Çizim 3. MVC yapısı

[Link] Bileşeni
Model, MVC’de uygulamaya ait verileri, uygulamanın durumunu ve uygulama
tarafından gerçekleştirilmesi gereken tüm iş mantığını (business logic) veya
işlemleri temsil eder. Proje yapısı ve büyüklüğüne göre tek katman veya birden
fazla katmandan da oluşabilir.

2.5.2. View Bileşeni


View, içeriğin kullanıcı arabirimi aracılığıyla sunulmasından sorumludur.
MVC’de projenin arayüzleri bu bölümde oluşturulur. .NET kodunu HTML içerisine
İpucu
yerleştirmek için Razor View Engine (Razor görünüm motoru) kullanır. İçerisinde Razor Wiew Engine (Razor Görünüm
minimum mantıksal işlemler yer almalıdır. Projenin geliştirildiği yazılım Motoru) konusuna 3. bölümde yer
dillerine göre dosya uzantıları da değişebilmektedir. Karmaşıklığı gidermek verilecektir.

35
adına View’larının yer aldığı klasörlerinin hiyerarşisi iyi ayarlanmalıdır. (HTML,
Javascript, CSS ve resim dosyalarını aynı klasör içinde barındırmamak vb.)

2.5.3. Conroller Bileşeni


Controller, kullanıcı etkileşimini yöneten, modelle çalışan ve sonuçta
oluşturulacak görünümü seçen bileşenlerdir. Bu bileşen kullanıcıdan gelen
istekleri(request) işler View ile Model arasında bağlantı kurarak kullanıcıya
hangi View’ın döneceği (response) belirtilir. Kısaca MVC modelinde controller
ilk giriş noktasıdır ve hangi model türleriyle çalışılacağını ve hangi görünümün
oluşturulacağını seçmekten sorumludur.

2.6. Routing(Yönlendirme)
[Link] Core MVC, anlaşılır ve arama işlemleri için uygun URL’lere
sahip uygulamalar oluşturulmasına olanak sağlayan güçlü bir URL eşleme
bileşenine sahiptir. Projeye ait web sunucusundaki dosyaların düzeninden ve
hiyerarşisinden bağımsız olarak, arama motoru iyileştirmesi (SEO) için de faydalı
olacak şekilde uygulamaya ait URL’lerinin düzgün olarak tanımlanmasını sağlar.
Gelen HTTP isteklerini eşleştirmekten ve bu istekleri uygulamanın yürütülebilir uç
noktalarına göndermekten sorumludur. (Routing – Yönlendirme işlemi, Startup.
cs’de yapılandırılır.)
[Link](name: “Default”, template: “{controller=Home}/
{action=Index}/{id?}”);
Kural tabanlı yönlendirme, uygulamanıza kabul edilen URL biçimlerini genel
olarak tanımlamanızı ve bu biçimlerin her birini belirli bir controller’da belirli
bir eylem(action) yöntemiyle eşlemenizi sağlar (Oluşturulan controller içindeki
public metodlar action olarak adlandırılır). Gelen bir istek geldiğinde yönlendirme
altyapısı URL’yi ayrıştırarak tanımlı URL biçimlerinden biri ile eşler ve ilişkili
denetleyicinin eylem yöntemini arar.
Varsayılan url kalıbı için controller, action parametreleri sıra ile “Home”,
“Index”dir. id değeri ise boş olabilir şeklinde tanımlanmıştır. Bunun anlamı gelen
istek URL’sinde bu değerler yoksa hangi denetleyici, action ve id parametresinin
kullanılması gerektiğini belirtir (Varsayılan olarak Home/Index).

36
WEB PROGRAMLAMA 2

Tablo 3. Url’ye göre Controller, Action ve Id değerleri (Web sunucusuna


ait TCP bağlantı noktası 3000)

URL Controller Action Id


[Link] HomeController Index null
[Link] HomeController Index 100
[Link] HomeController About null
[Link] HomeController Contact null
[Link] OgrenciController Index null
[Link] OgrenciController Create 100

2.7. MVC Yaşam Döngüsü


Bir MVC uygulaması geliştirdiğimizde uygulamamıza gelen istek(request)
HTTP üzerinden bir web sunucu (IIS vb.) tarafından alınır. Gelen isteğin hangi
controller tarafından karşılanacağına karar verilir. Gelen route bilgisine göre
Controller hangi Metodu (Action) çalıştıracaksa genel olarak ilgili View çalıştırılır.
HTTP üzerinden View kullanıcıya gösterilir.
Görsel [Link] de görüldüğü gibi ilk proje oluşturulduğunda “Solution Explorer”
kısmında Controllers, Models ve Views isminde klasörler görünmektedir.
Controllers klasörü, controller için sınıf dosyalarını içerir. [Link] MVC
uygulamalarında, tüm Controller’lar isimlendirilirken “Controller” ile bitecek
şekilde isimlendirilirler. Aynı zamanda oluşturulan bir controller bu klasörün
altında yer almalıdır (Örneğin Ogrenci isimli bir controller OgrenciController
isminde olmalıdır). Controller, [Link] temel
sınıfından türetilen bir sınıftır. Controller sınıfı, Action metotları adı verilen genel
metotları içerir. İlgili Controller ve Action’a gelen istek, gerekli Model verileri
alınarak işlenir ve uygun yanıtlar döndürülür.

2.8. [Link] CORE’da Controller


Yeni bir Controller oluşturmak için Solution Explorer kısmında Controller
klasörüne sağ tıklanarak Add >> Controller seçenekleri seçilir.

37
Görsel 14. Controller Ekleme

Add New Scaffolded Item iletişim kutusunda oluşturulabilecek bazı hazır


şablonlar mevcuttur. Boş bir Controller oluşturmak için MVC Controller- Empty
(Boş) ögesi seçilir.

Görsel 15. Controller ögesi seçimi

Son olarak oluşturulan Controller’a “Controller” son eki ile bitecek şekilde
isimlendirme gerçekleştirilir. Aşağıda Görsel 15’te OgrenciController isminde

38
WEB PROGRAMLAMA 2

bir bir Controller oluşturulmuştur (Oluşturulan tüm Controller’lar Controler


sınıfından miras almalıdır).

Görsel 16. Controller İsimlendirmesi

Controller klasörü altında oluşturulan [Link] (burada .cs


uzantısı c# dosyası olduğunu belirtir controller c# class’ı olarak tanımlamıştır)
kodunda Görsel [Link] verilen değişiklik yapıp programı çalıştıralım.

Görsel 17. OgrenciController altındaki geriye string dönen Index()


metodu

39
Program çalıştığında (F5, ya da yeşil ok tuşuna basarak) varsayılan olarak
tanımlı olan HomeController’ı isteği karşılayacaktır. Tarayıcımızın adresine http://
localhost:3000/Ogrenci (Buradaki port numarası 3000 sizlerin bilgisayarında
farklı olabilir) yazıp çalıştırdığımızda ise OgrenciController’ı altında yer alan
Index metodu çağrılacaktır. Geriye string dönen bu metot ile de ekrana Görsel
[Link] gibi bir çıktı oluşacaktır.

Görsel 18. OgrenciController’ının çağrılması (Controller çağrılırken


son ek olarak tanımlı kısmı dahil edilmez OgrenciController - Ogrenci
şeklinde çağrılmıştır)

Controller sınıfının 18 public metotları “Action Metot” olarak adlandırılır.


Action metotlar public olmalıdır. Static ve aşırı yüklenmiş metotlar action
metot olamazlar. Aşağıdaki kodlarda görüleceği gibi, Index() metodu public’tir
ve View() yöntemini kullanarak ActionResult’u döndürür. View() yöntemi,
uygun ActionResult değerini döndüren Controller temel sınıfında tanımlanır.
Genel olarak Action’lar, View veya Json verilerini döndürmekle birlikte sıklıkla
kullanılan ActionResult’lar kısaca aşağıda açıklanmıştır.
• IActionResult-ActionResult IActionResult birden fazla türde sonuç
döndürüldüğünde kullanılır.
public IActionResult Home()
{
return View();
}
• JsonResult, nesneyi JSON’a biçimlendirir.
public JsonResult Index()
{

return Json(JsonData);
}
• ContentResult, ContentResult kullanılarak string, HTML veya JSON
döndürülebilir.

40
WEB PROGRAMLAMA 2

public ContentResult Index()


{
string icerik = “<div><b> Merhaba</ b ></ div >”;
return Content(icerik, “text/html”);
}
Bunların dışında [Link] Core; PageResult, ViewResult, RedirectResult,
FileResult, StatusCodeResult, NotFoundResult gibi birçok farklı IActionResult
türüne sahiptir
[Link] ye ait kodlarda ilgili kısım aşağıdaki gibi güncellenip
tarayıcıda [Link] şeklinde bir url adresi
girilerek çalıştırıldığında Görsel [Link] gösterilen ekran görüntüsü elde edilir.
public class OgrenciController : Controller
{
public string Index(int id)
{
return “Merhaba Öğrenciler ID=”+id;
}
}

Görsel 19. Controller’a id Parametresi Gönderimi

MVC tarafından kullanılan URL yönlendirme mantığı, çağrılan kodu belirlemek


için /[Controller]/[ActionName]/[Parameters] şeklinde bir biçim kullanır.
[Link] çağrıldığında; OgrenciController’ının
içinde Index metodu, id’si 100 olacak şekilde çağrılmış olur. public string Index(int
id) ile de url’den gelen id parametresi alınarak kullanılabilir.

2.9. [Link] CORE’da View


[Link] Core MVC’de View’ler, Razor biçimlendirmesinde C# programlama
dilini kullanan .cshtml dosyalarıdır. Genellikle, View dosyaları, uygulamanın
Controller’ların her biri için adlandırılmış klasörler halinde gruplandırılır. Bu
klasörler, uygulamaya ait Views klasöründe yer alırlar.
Örneğin OgrenciController’ı, Views klasörü altındaki bir Ogrenci klasörüyle
temsil edilir. Ogrenci klasörü OgrenciController class’ında yer alan Action’lara
ait web sayfalarının görünümlerini içerir. (Eğer Actionlar görünümlerle ilişkili

41
ise) Bir kullanıcı burada yer alan görünüm dosyalarından birini istediğinde,
OgrenciController’ındaki Action Metot bir web sayfasını oluşturmak ve kullanıcıya
geri döndürmek için hangi görünümün kullanılacağını belirler (Görünüm adı
yerine bir görünüm dosyası yolu kullanılıyorsa cshtml uzantısı belirtilmelidir.
Örneğin return View(“Views/Home/[Link]”);).
MVC çerçevesiyle, HTML oluşturmanın en popüler yöntemi, [Link] CORE
MVC’nin Razor görünüm motorunu kullanmaktır. Yukarıdaki örneğimizde
OgrenciController’ına Bilgi() isimli bir Action Metot tanımlayalım.
public class OgrenciController : Controller
{
public ActionResult Bilgi()
{
return View();
}
}
Bilgi() metodunun ilişkilendirildiği görünüm dosyası Solution Explorer
kısmında Views klasörü altında Bilgi() metodunun içinde bulunduğu controller
ismi ile (burada Ogrenci) yer almalıdır. Bunun için View klasörüne sağ tıklanarak
Ogrenci isminde yeni klasör oluşturulmuştur.

Görsel 20. Controller’lar için View klasörleri


42
WEB PROGRAMLAMA 2

Bu aşamadan sonra Ogrenci klasörüne sağ tıklanarak aşağıdaki [Link]


dosyası aşağıdaki adımlar ile oluşturulur.

Görsel 21. View Oluşturma

Razor View-Empty seçilerek oluşturulan bu dosya içine aşağıdaki kod yazılıp


program çalıştırıldığında bu görünüm dosyasının çağrılması için tarayıcıda
Ogrenci Controlleri altındaki bilgi Action’ çağrılmalıdır.
<b>Öğrenci Bilgileri</b>

43
Görsel 22. OgrenciController’ındaki bilgi Action’unun çağrılması

2.10. [Link] CORE’da Model


[Link] CORE MVC uygulamalarında Model sınıfları Model klasöründe
oluşturulmalıdır. Model klasörüne sağ tıklanarak, Add >> Class’a tıklandığında
Yeni Öge Ekle iletişim kutusu açılacaktır. Gelen ekranda Class seçilerek
oluşturulacak class’a bir isim girilir.

Görsel 23-1. Model Oluşturma

44
WEB PROGRAMLAMA 2

Görsel 23-2. Model Oluşturma

Burada Ogrenci isminde bir class oluşturulmuştur. Bu Ogrenci sınıfında


öğrencilerin adını, soyadını, numarasını ve yaşını saklamak istediğimizde
aşağıdaki gibi OgrAd, OgrSoyad OgrNo, OgrYas özellikleri (properties) eklenmiştir.
public class Ogrenci
{
public string OgrAd { get; set; }
public string OgrSoyad { get; set; }
public string OgrNo { get; set; }
public int OgrYas { get; set; }
}
Model sınıfına ait nesneler controller aracılığı ile View’lere gönderilerek İpucu
kullanım sağlanabilir. İleriki bölümlerde örneklerle açıklama yapılacaktır. View’e veri aktarımı konusuna 5.
bölümde yer verilecektir.

45
Bu Bölümde Ne Öğrendik?

* Visual Studio; GUI(Grafik Kullanıcı Arayüzü), web uygulamaları, konsol uygulamaları, mobil uygulamalar,
bulut ve web hizmetleri vb. geliştirmek için kullanılan bir Entegre Geliştirme Ortamıdır (IDE).

* Microsoft’un öğrenme amacıyla sağladığı Visual Studio Community ücretsiz bir sürümdür.

* Visual Studio, farklı türde uygulamalar geliştirmek için; Razor Pages, MVC ve Web Api uygulamaları gibi
birçok [Link] Core şablonu içermektedir.

* Model-View-Controller (MVC) mimari modeli, bir uygulamayı model, görünüm (View) ve denetleyici
(Controller) olmak üzere üç ana bileşene ayırmaktadır.

* Model, MVC’de uygulamaya ait verileri, uygulamanın durumunu ve uygulama tarafından gerçekleştirilmesi
gereken tüm iş mantığını veya işlemleri temsil eder.

* View, içeriğin kullanıcı arabirimi aracılığıyla sunulmasından sorumlu bileşendir.

* Controller, kullanıcı etkileşimini yöneten, modelle çalışan ve sonuçta oluşturulan görünümü seçen
bileşendir.

* Bir MVC yaşam döngüsünde uygulamaya gelen istek HTTP üzerinden bir web sunucu tarafından
alınır. Gelen isteğin hangi controller tarafından karşılanacağına karar verilir. Gelen route bilgisine
göre Controller hangi Metodu çalıştıracaksa genel olarak ilgili View çalıştırılır. HTTP üzerinden
View kullanıcıya gösterilir.

46
WEB PROGRAMLAMA 2

[Link]
Kaynakça
[Link] Pro [Link] Core 3: Develop Cloud-Ready Web Applica-
overview?view=aspnetcore-5.0 tions Using MVC, Blazor, and Razor Pages, 2020, Adam
Freeman
[Link]
mvc_pattern.htm

[Link]
şam-döngüsü-life-cycle-8e124f24650c

47
Bölüm Soruları
1) Visual studio kurulum seçeneklerinden hangisi ücretsizdir?
a) Community b) Professional c) Enterprise
d) FullPacket e) LittlePacket

2) Visual studio ile gelen Sql Server sürümü seçeneklerinden hangisinde


yer alır?
a) SQL Server Enterprise
b) SQL Server Professional
c) SQL Server Side
d) SQL Server Project
e) SQL Server Express

3) [Link] Core MVC’de proje klasörleri nerede görülebilir?


a) Toolbox
b) Solution Explorer
c) Layout
d) Error List
e) Debug

4) Bir MVC yapısında istekleri hangi bileşen karşılar?


a) Model
b) View
c) Controller
d) Component
e) Route

5) [Link] core projesini çalıştırmak için ……. tuşuna basılabilir. İfadesinde


boşluğa ne gelebilir?
a) F1
b) F2
c) F3
d) F4
e) F5

6) [Link] Core MVC projesinde [Link]


url’si ile gelen istek hangi Controller tarafından karşılanır?
a) HomeController
b) KaydetController
c) OgrenciController
d) ControllerClass
e) ControllerBase

48
WEB PROGRAMLAMA 2

7) [Link] Core MVC projesinde [Link]


url’si ile gelen istek hangi action metot tarafından karşılanır?
a) Kaydet
b) Ogrenci
c) Model
d) ActionKaydet
e) ActionBase

8) [Link] Core MVC projelerinde Controller’ların uzantısı nedir?


a) .html
b) .cs
c) .cshtml
d) .asp
e) .js

9) Aşağıdakilerden hangisi/hangileri MVC yapısında bulunan bileşenlerdir?


I. Model
II. View
III. Component

a) Yalnız I
b) Yalnız II
c) I ve II
d) II ve III
e) I,II ve III

10) [Link] Core MVC projelerinde Controller’daki varsayılan action metot


aşağıdakilerden hangisidir?
a) Home
b) Index
c) Main
d) Default
e) Core

Cevaplar
1-a 2-e 3-b 4-c 5-e 6-c 7-a 8-b 9-c 10-b

49
50
3. LAYOUT KAVRAMI VE RAZOR VİEW ENGİNE
(RAZOR GÖRÜNÜM MOTORU)
Tasarımda mükemmellik, ekleyecek bir
şey kalmadığında değil, çıkaracak bir şey
kalmadığında yakalanır.
Antonie de Saint-Exupery
Ders videosunu izlemek için
QR kodu taratın.

Kazanımlar Birlikte Düşünelim


• Layout kavramını öğrenebilir.
• Layout tanımlayabilir ve projede kullanabilir. 1. Layout kavramı nedir?
• Razor kavramını hakkında bilgi sahibi olabilir .
• Razor söz dizimini kullanarak [Link] Core MVC’de kodlar 2. ASP. Net Core MVC projelerinde
yazabilir. Layout nasıl kullanılır ve düzen-
• Döngüler ve koşullu ifadeleri projelerinde kullanabilir. lenir?

Başlamadan Önce 3. View Engine (görünüm motorla-


Bir önceki bölümde MVC yapısı ve [Link] Core ile bu yapının rı) kavramı nedir?
kullanımı ele alınmıştı. Bu bölümde ise layout kavramı Razor View
Engine konusu ele alınacaktır. Web projelerinde var olan içerik kadar 4. Razor View Engine söz dizimi
içeriğin kullanıcıya nasıl sunulduğu da son derece önemlidir. Web nasıldır?
sitesindeki içeriği bulmak zor olduğunda kullanıcılar siteyi terk etme
eğilimindedir. Layout kavramı bir web sayfası bir tasarımın içeriğini 5. Koşullu ifadeler ve döngüler
düzenleme şeklimizi ifade eder. Kullanılabilir bir web sayfası Layout ile view’lerde nasıl kullanılabilir?
birlikte takip edilmesi kolay bir navigasyon sistemine sahip olmalıdır.
Düzgün bir layout ile site ziyaretçisi gerekli bilgilere kolayca ulaşabilir.

51
3.1 Layout Kavramı
Çoğu web uygulamasının, sayfalar arası gezintide kullanıcıya sunduğu tutarlı
ve ortak bir düzeni vardır. Yani uygulamamız çoğu zaman, uygulama boyunca
aynı kalan üstbilgi (header),
Çizim 4 sol menü (left navigation), alt bilgi (footer) vb. belirli
•••••••• ••••••
bölümler içerir.

Header

Left Navigation Content

Footer

Çizim 4. Örnek Bir Layout Görünümü

Tekrarlanan kodlamayı ortadan kaldıran ve uygulama geliştirme hızını kolay


bakım ile birlikte arttıran Layout (düzen–şablon görünümü) ile; uygulamanın
birden çok sayfasında tutarlı ve ortak bir site görünümü tanımlanmış olur. Layout,
diğer viewler gibi .cshtml uzantısına sahiptir ve projede yer alan diğer view’ler
ile paylaşıldığı için view klasörününün altında Shared adlı klasörde yer alır. Bir
[Link] Core Mvc uygulaması oluşturulduğunda varsayılan olarak, _Layout.
cshtml ismi ile projede tanımlanır. _Layout.cshtml dosyasının içeriği aşağıdaki
gibidir. Burada varsayılan olarak tüm proje için css ve javascript’ler (bootsrap
ve jquery kütüphaneleri) projeye dâhil edilmiştir. (Herhangi bir [Link] Core
projesi oluşturulduğunda css, javascpirt, resim vb. dosya ve kütüphanelerin
içiresinde barındırılabileceği wwwroot klasörü otomatik olarak oluşturulur. Bu
klasörde yer alan dosyalar layout’ a eklenerek tüm projede kullanılabilir. ) <nav>
bloğu ile üst menü oluşturulmuş bu menü bootsrap’te tanımlı menü seçenekleri
ile zenginleştirilmiştir. Altta yer alan <footer> kısmı ile de genellikle uygulama
yürütücüsü ve telif hakkı verileri tanımlanır.

52
WEB PROGRAMLAMA 2

Burada dikkat edilirse @RenderBody() isminde bir metot çağrılmıştır. İçerik


sayfası işlendikten sonra bu kısma yerleşir.
Layout tanımlı bir MVC projesinde, bir controller da action metot ile bir
view çağırdığında view tarafından oluşturulan HTML kodu, Layout kısmında
yer alan RederBody() alanına yerleştirilecektir. Hangi view’lerin hangi Layout’u
kullanacağı ortak bir _ViewStart.cshtml dosyasında veya her bir view içinde
aşağıdakine benzer bir kodla tanımlanabilir.
@{
Layout = “_Layout”;
}

Eğer kendi şablon yapınızı oluşturmak istiyorsanız bunu da


gerçekleştirebilirsiniz. Örneğin Shared klasöründe _LayoutDeneme.cshtml (shared
klasorunda sağ tıklayarak _LayoutDeneme isimli boş bir view oluşturabilirsiniz)
isimli bir dosya oluşturalım. Bunun içeriğini de aşağıdaki kod bloğuna benzer
tanımlayalım.

<!DOCTYPE html>
<html>

53
<head>
<meta name=”viewport” content=”width=device-width” />
<title>@[Link]</title>
</head>
<body>
<table border=”1” style=”width:1024px; height:768px;”>
<tr>
<td colspan=”2” style=”text-align:center; height:100px;”>
<h3>Header Bölümü</h3>
</td>
</tr>
<tr>
<td style=”width:150px”>
<h3>Sol Menü</h3>
</td>
<td style=”width:600px”>
@RenderBody()
</td>
</tr>
<tr>
<td colspan=”2” style=”text-align:center; font-size:x-small;height:60px;”>
<h3>Footer Bölümü</h3>
</td>
</tr>
</table>
</body>
</html>
_ViewStart.cshtml dosyasında da artık bizim oluşturduğumuz _LayoutDeneme.
cshtml isimli dosyanın kullanılacağını aşağıdaki kod ile belirtelim:
@{
Layout = “_LayoutDeneme”;
}

Projemiz artık bizim şablonumuza uygun olarak çalışacaktır.

3.2. Razor View Engine(Razor Görünüm Motoru)


Programlama dilleri ile web projeleri üretildiğinde bazı zamanlar View’ler
(görünüm) içinde o programlama diline ait kodlar yazılması gerekebilir. Yani
görünümler HTML ile beraber bir programlama diline ait kodlar içerebilir.
Fakat görünümler Html verilerini göstermek zorundadır. Bunun için kullanılan
programlama diline ait kodların Html çıktılarının üretilmesi gerekir. View Engine

54
WEB PROGRAMLAMA 2

(görünüm motorları) bu kodları Html’ye dönüştürürler. (Controller’daki bir Action


tarafından çağrıldığında bir HTML yanıtı üretmekten sorumludur.)
Okuma Önerisi
.Net Faramework’ün çeşitli sürümlerinde kullanılan Aspx, Spark gibi görünüm Algan, S. (2021). Her Yönüyle C#
motorları [Link] Core’da tamamen yerini Razor görünüm motoruna bırakmıştır. 7.0. İstanbul: Pusula Yayıncılık.
Razor View Engine, [Link] Core uygulamaları için varsayılan View Engine’dir.
Görünüm dosyalarında Razor işaretlemesini arar bunları parse ederek HTML
yanıtını üretir. [Link] Core MVC’de bir Controller bir View çağırdığında View’ler,
verileri işleme ve yanıt oluşturma yeteneğine sahip olmalıdır. Bir View içerisinde
kullanılan C# kodları Razor View Engine ile HTML’yi oluşturmak için kullanılır.
Razor biçimlendirmesini içeren dosyalar genellikle .cshtml dosya uzantısına
sahiptir.

3.2.1. Razor Söz dizimi


Razor, HTML’den C# koduna geçiş yapmak için @ sembolünü kullanır. Geçişleri
Çizim
gerçekleştirebileceğiniz iki yol 5 Tekli işlemler yapmak için @ sembolünden
vardır.
sonra kod ifadesinin gelmesi yeterli iken, birden fazla işlem yapılacağı zaman @{
kodlar} şeklinde bir blok yapısı kullanılmalıdır.

HTML
Pure
+ View Engine
HTML
C# Code

Razor View Browser

Çizim 5. Razor View Engine

Örneğin bir view içinde


Tarih : @[Link]() şeklinde bir kod yazdığımızda @DateTime.
[Link]() kodu Razor tarafından C# kodu olarak yorumlanıp ekrana
basılacaktır. ( Tarih : 14.08.2021 16:33:28 gibi günün tarih ve saatini veren bir çıktı)
Fakat kod Tarih : [Link]() şeklinde yazılmış olsaydı Herhangi
bir yorumlama olmadan çıktı aynı şekilde ekrana basılacaktır. (Çıktı : Tarih :
[Link]())

55
Razor, yorum-açıklama bloğu için “@*...*@” söz dizimini kullanır. C#
içerisinde yorum-açıklama gerçekleştirmek için ise çoklu satır açıklamalarda
/*…*/ , tek satır açıklamada // kullanılabilir. HTML yapısı içerisinde ise açıklama
bloğu <!-- … --> şeklindedir.
@* açıklama*@
@{
/*
Çoklu satır
açıklama
*/

//Tek satır açıklama


}
<!--
HTML bloğu açıklama
-->

3.3. Koşullu İfadeler


Koşullu ifadeler, programcı tarafından tanımlanan bir koşulun, doğru veya
yanlış olarak değerlendirilmesine bağlı olarak farklı hesaplamalar veya eylemler
gerçekleştirilmesidir. [Link] CORE projelerinde .cs uzantılı dosyalarda ya da
Razor kodunda koşullu ifadeler C# söz dizimine uygun olarak kullanılabilir. C#
koşullu ifadelerinin açıklamaları ile beraber View içerisinde kullanım örnekleri
aşağıda gösterilmiştir.
• if : Belirtilen bir koşul doğruysa yürütülecek bir kod bloğu belirtmek için if
kullanılır.
@{var fiyat = 100;}
<html>
<body>
@if (fiyat > 50)
{
<p>Fiyat 50 liradan fazla.</p>
}
</body>
</html>
Burada if şartı doğru (true) ise sonrasındaki blok çalıştırılır. Daha sonra
program normal bir akışla çalışmaya devam eder. Şartın değeri yanlış (false) ise,
bu durumda program doğrudan şart ifadesinden sonraki blok çalışmaz. else
Belirli bir koşul yanlışsa, yürütülecek kod bloğunu belirtmek için if den sonra else
kullanılır.
@{
var sayi1 = 100;

56
WEB PROGRAMLAMA 2

var sayi2 = 200;


}
<div>
@if (sayi1 > sayi2)
{
<p>Sayi1 Büyük</p>
}
else
{
<p>Sayi2 Büyük</p>
}
</div>

if şartı doğru ise if şartının hemen ardındaki blok çalıştırılır ve else bloğuna
girmeden komutlar çalıştırılmaya devam eder. Şartın değeri yanlış ise, bu durumda
doğrudan else’i takip eden blok çalıştırılır. Bu blok çalıştırıldıktan sonra program
yine çalışmaya kaldığı yerden devam eder. Özetle if şartı sağlanıyorsa altındaki
blok sağlanmıyorsa else bloğu çalışır.
• else if : İlk koşul yanlışsa, işlem yapılacak yeni bir koşul belirtmek için else
if yapısı kullanılır.
@{var fiyat = 40;}
<div>
@if (fiyat >= 100)
{
<h2>Fiyat Yüksek.</h2>
}
else if (fiyat > 30 && fiyat < 50)
{
<h2>Fiyat Normal</h2>
}
else
{
<h2>Fiyat düşük.</h2>
}
</div>
if şartı doğru ise sonrasındaki blok çalıştırılır ve else if bloğuna girmeden
komutlar çalıştırılmaya devam eder. Şartın değeri yanlış ise else if bloğuna girer
ve buradaki şarta bakarak yoluna devam eder.
Switch: switch deyimi bir ifadenin değerine göre çoklu sayıda koşul kontrolü
sağlayan bir komuttur. Bir koşul ifadesinde çok sayıda dallanma gerçekleşiyorsa
if-else blokları ile akışın izlenmesi zorlaşacağından böyle durumlarda switch-
case kullanımı daha anlaşılabilir bir yapı sunar. switch deyimi ile kontrol edilmek

57
istenen ifadenin sonucu case satırlarında yer alan değerler ile karşılaştırır. Bu
değerle eşleşen case ifadesi bulunursa, o bloktaki kodlar çalıştırılır. default
kısmı switch ifadeleri için zorunlu olmayıp, kullanıldığında case şartlarından
hiçbiri ifade ile uyuşmuyorsa, programın akışı default‘u izleyen kısmına geçer.
case bloklarının sonunda break komutu ile akış kesilir ve siwtch-case bloğu
sonlandırılır. Program bir sonraki işlem satırından çalışmasına devam eder.
Aşağıdaki örnek de day değişkeni haftanın hangi günü olduğuna bağlı olarak [0-
6] arasında değer almaktadır.
@{
string txt = “”;
int day = Convert.ToInt32( [Link]);
switch (day)
{
case 1:
txt = “Pazartesi”;
break;
case 2:
txt = “Salı”;
break;
case 3:
txt = “Çarşamba”;
break;
case 4:
txt = “Perşembe”;
break;
case 5:
txt = “Cuma”;
break;
default:
txt = “Tatil”;
break;
}
<br />

<h2>Bugun <b>@txt</b></h2>

}
Yukarıdaki örnekte day değişkeni ile integer olarak alınan haftanın günleri
switch-case yapısı ile kontrol edilmiştir.

58
WEB PROGRAMLAMA 2

3.4. Döngüler
Herhangi bir programlama dilinde döngü, belirli bir koşula göre bir ya
da birden fazla ifadeyi birden çok kez yürütmenin bir yoludur. Döngüler içinde
Anahtar Kavram
ifadeleri yürütmek için sonuç koşulu doğru olmalıdır. Programlama Dili: Belli bir
standart format üzerinde komut
ve yazılım geliştirmeyi sağlayan
bilgisayar dilidir. Bilgisayar ve
kullanıcı arasında verimli bir ileti-
şim sağlanması bu dil sayesinde
gerçekleştirilebilir.

Şekil 5. Döngüler

for döngüsü: Genelde bir kod bloğunun ne kadar tekrarlanmak istendiğinin


bilindiği durumlarda kullanılır. For döngüsü ile başlangıç; karşılaştırma ve
artış/azaltma ifadeleri ile döngü akışı sağlanır. for döngüsü içindeki ilk ifade de
döngünün akışını kontrol edecek değişkenin başlangıç değeri tanımlanır. İkinci
ifade de döngünün şartının sağlanıp sağlanmadığı kontrol edilir şart sağlandıkça
döndü devam eder. Son ifade de ise, ilk ifade de değeri atanan değişkenin değişimi
ayarlanır (artış ya da azalış).
@{
string[] Ogrenciler = { “Semra”, “Hasan”, “Tuncay”, “Mehmet” };
}
@for (int i = 0; i < [Link]; i++)
{
<p>@Ogrenciler[i]</p>
}
Yukarıda, bir view içerisinde tanımlanan Ogrenciler isimli string dizisinin
elemanları ekrana yazdırılmaktadır. Ogrenciler dizisinin ilk elemanı dizinin
0. indisli elemanıdır. [Link] ile de bu dizi içerisinde kaç eleman

59
olduğu bulunmuştur. (Örnek için 4 eleman) int i değerinin başlangıç değeri 0
olarak atanmıştır. Ogrenciler dizisinin ilk elemanı olan 0 indisli elemandan
(Ogrenciler[0]) bu diziye ait son eleman olan 3. elemana (Ogrenciler[3]) kadar olan
değerler ekrana yazdırılmıştır.
Bu kod için Razor tarafından üretilen Html çıktısı aşağıdaki gibidir.
<p>Semra</p>
<p>Hasan</p>
<p>Tuncay</p>
<p>Mehmet</p>
Foreach döngüsü: for döngüsünün özelleşmiş bir halidir. Bir dizi veya
koleksiyondaki her bir eleman için bir kod bloğu yürütür. Bunu bir index’e gerek
olmadan gerçekleştirdiğinden for döngüsünde yanlış index işlemlerinin önüne
geçmek için kullanılabilir. Yukarıda for döngüsü ile gerçekleştirilen örneğe ait
foraech yapısı aşağıda yer almaktadır.

@{
string[] Ogrenciler = { “Semra”, “Hasan”, “Tuncay”, “Mehmet” };
}

@foreach (var ogr in Ogrenciler)


{
<p>@ogr</p>
}
while döngüsü: while anahtar kelimesiyle başlar. Bu kelimenin yanında
parantez içinde true veya false döndüren bir boolen koşullu ifade yer alır. Belirtilen
koşullu ifade false döndürene kadar kod bloğunu yürütülür.
@{

string[] ogrenciler = { “Semra”, “Hasan”, “Tuncay”, “Mehmet” };

int i = 0;
}
<p>
<ul>
@while (i < [Link] )
{

@:
<li>@ogrenciler[i]</li>
i++;
}
</ul>

60
WEB PROGRAMLAMA 2

</p>
Yukarıdaki kod çalıştırıldığında while döngüsüne girmeden şart kontrol edilir.
başlangıçta i=0 [Link], (4) değerinden küçüktür. Bu durumda döngü
işletilir. Bu eşitlik her bir iterasyondan sona tekrar kontrol edilir. True değer
sağlandığı müddetçe döngü devam eder. False durumunda döngü sonlanır. NOT:
@ ile HTML içine C# yazılabilirken, @: ile C# içine HTML yazılabilir.

Kodun Ekran Görüntüsü Kodun Html çıktısı


Semra <p>
Hasan <ul>
Tuncay <li>Semra</li>
Mehmet <li>Hasan</li>
<li>Tuncay</li>
<li>Mehmet</li>
</ul>
</p>

do-while döngüsü: While döngüsüne benzer, while döngüsünden


farkı kontrol şartının döngü bloğundan sonra gerçekleşmesidir. Bu döngü
yapısı kullanıldığında her ne olursa olsun bir kere de olsa döngü bloğuna
girilmiş olur. While döngüsünde yaptığımız örneği do-while ile aşağıdaki
şekilde gerçekleştirebiliriz. NOT: bu örnek için çıktılarda bir fark yoktur. Fakat
unutulmaması gereken nokta do-while ile döngüler kullanıldığında ilk iterasyonun
şart sağlanmasa da çalıştığıdır.
@{

string[] ogrenciler = { “Semra”, “Hasan”, “Tuncay”, “Mehmet” };

int i = 0;
}
<p>
<ul>
@{ do
{

<li>@ogrenciler[i]</li>
i++;
} while (i < [Link]);
}
</ul>
</p>

61
Döngüler kullanımında belirli şartlar gerçekleştiğinde kimi zaman döngüden
çıkmak, kimi zamanda döngünün bir sonraki iterasyonuna atlamak istenebilir.
break komutu ile bir kod bloğu veya döngü içinde daha fazla kodun yürütülmesi
durdurulur. continue ile ise iterasyon kesilir ve döngüdeki bir sonraki iterasyondan
devam edilir.

62
WEB PROGRAMLAMA 2

Bu Bölümde Ne Öğrendik?

* Layout tekrarlanan kodlamayı ortadan kaldırır ve uygulama geliştirme hızını kolay bakım ile artırabilir.

* Layout ile uygulamanın birden çok sayfasında tutarlı ve ortak bir site görünümü tanımlanmış
olur.

* Razor View Engine, [Link] Core uygulamaları için varsayılan View Engine’dir.

* Razor, HTML’den C# koduna geçiş yapmak için @ sembolünü kullanır.

* Razor geçişleri gerçekleştirirken iki yol kullanır. Tekli işlemler yapmak için @ sembolünden sonra kod
ifadesinin gelmesi yeterli iken, birden fazla işlem yapılacağı zaman @{ kodlar} şeklinde bir blok yapısı
kullanılmalıdır.

* Koşullu ifadeler, programcı tarafından tanımlanan bir koşulun doğru veya yanlış olarak
değerlendirilmesine bağlı olarak farklı hesaplamalar veya eylemler gerçekleştirilmesidir.

* Döngü, belirli bir koşula göre bir ya da birden fazla ifadeyi birden çok kez yürütmenin yollarından
biridir.

63
Kaynakça
[Link] [Link]
views/layout?view=aspnetcore-5.0 layout

[Link] [Link]
asp-net-core-layouts-and-sections/ core-razor-view-engine/

[Link]

64
WEB PROGRAMLAMA 2

Bölüm Soruları
1) Bir Layout oluştururken yapılması gereken ilk şey nedir?
a) Layout oluşturmak
b) Resim eklemek
c) Arka plan seçimi yapmak
d) Layout şablonuna karar vermek
e) Programı çalıştırmak

2) Bir [Link] Core Mvc uygulaması oluşturulduğunda varsayılan olarak


Layout ismi nedir?
a) [Link]
b) _Layout.cshtml
c) [Link]
d) [Link]
e) [Link]

3) Aşağıdakilerden hangisi [Link] Core’da varsıyılan görünüm motorudur?


a) Razor
b) Asp
c) Spring
d) Php
e) View

@{
string[] Ogrenciler = { "Semra", "Hasan", "Tuncay", "Mehmet" };
}
<ul>
@for (int i = 0; i < [Link] - 1; i++)
{
<li>@Ogrenciler[i]</li>
}

</ul>
4 ve 5. sorular yukarıdaki koda göre cevaplanacaktır

4) Yukarıdaki kod çalıştığında ekrana kaç adet isim yazar?


a) 0 b) 1 c) 2 d) 3 e) 4

65
5) Kod çalıştırıldığında ekran görüntüsü ne olur?
• Semra
• Hasan
a)
• Tuncay
• Mehmet
• Semra
b) • Hasan
• Tuncay
Semra
Hasan
c)
Tuncay
Mehmet
Semra
d) Hasan
Tuncay
<p>
<ul>
<li>Semra</li>
<li>Hasan</li>
e)
<li>Tuncay</li>
<li>Mehmet</li>
</ul>
</p>

@for (int i = 5; i < 4; i++)


{
@[Link]()
}

6) [Link] Core MVC uygulamasında ait bir View’de yukarıdaki kod


çalıştırıldığında ekran görüntüsü ne olur?
a) Ekrana hiçbir şey basılmaz.
b) @[Link]()@[Link]()
c) 123
d) 12345
e) iiii

@{
var i = 0;
while (i < 5)
{
i += 4;
<div>Deger @i</div>
}
}
66
WEB PROGRAMLAMA 2

7) Yukarıda yer alan kod çalıştırıldığında ekran görüntüsü ne olur?

a) b) c) d) e)
Değer 2 Deger 1 Deger 6 Deger 4 Deger 2
Değer 6 Deger 5 Deger 8 Deger 8 Deger 3

@{
var i = 7;
while (i < 15)
{
i += 2;
<div>Deger @i</div>
}
}

8) [Link] MVC projesinde yukarıda verilen kodun hangi yapı içerisinde


kullanılması uygun olur?
a) Model
b) View
c) Component
d) Class
e) Controller

9) Razor yapısında HTML’den C# koduna geçiş yapmak için hangi sembol


kullanılır?
a) &
b) /
c) //
d) @
e) #

10) Uygulamanın birden çok sayfasında tutarlı ve ortak bir site görünümü
tanımlanmasına yardımcı olan yapının adı nedir?
a) Razor
b) Nav
c) Footer
d) Layout
e) Content

Cevaplar
1-d 2-b 3-a 4-d 5-b 6-a 7-d 8-b 9-d 10-d

67
68
4. FORM İŞLEMLERİ VE MODEL BAĞLAMA
Önce meseleyi çözün sonra kodu yazın.
John Johnson

Ders videosunu izlemek için


QR kodu taratın.

Kazanımlar Birlikte Düşünelim


• HTML form ile etkileşimli sayfalar yapabilmeyi öğrenebilir.
• HTML form elemanlarını kullanabilir. 1. Html Formların önemi nedir?
• HTML Form elemanları ile gönderilen verileri alabilir.
• Model bağlama ile http isteklerinden gelen verileri model 2. Html Form yapısı nasıldır?
yapısı ile eşleştirip kullanabilir.
3. Önemli Form elemanları neler-
Başlamadan Önce dir?
Önceki bölümde layout ve Razor View Engine konularına yer verilmiş
ve son olarak koşul ve döngü kavramları açıklanmıştı. Bu bölümde ise 4. Veriler Html form yapısında
form ve model bağlama konularına yer verilecektir. Çoğu web projesi hangi yöntemler ile sunucuya
kullanıcılar ile etkileşim halindedir. Web formları, bir kullanıcı ile bir gönderilebilir?
web sitesi veya uygulama arasındaki ana etkileşim noktalarından biridir.
Web sayfalarında, oturum açıldığında veya siteye kaydolunduğunda, 5. Model bağlama nedir ve nasıl
ödeme verileri girildiğinde, geri bildirimde bulunulduğunda, sosyal gerçekleştirilir?
bir platformda bir yorum gerçekleştirildiğinde vb. genel olarak formlar
kullanılır. Bu işlemlerde kullanılan form elemanları vasıtası ile veriler
sunucuya gönderililir.

69
4.1. Form
Web formları, kullanıcılar ile bir web sitesi veya web uygulaması arasındaki
ana etkileşim noktalarından biridir. Formlar, verilerin işlenmesi ve depolanması
için gerekli olan bir takım verilerin kullanıcıdan alınarak web sunucusuna
gönderilmesi şeklinde çalışır. Bugün formlar ile; metin alanları, açılır kutular,
butonlar, onay kutuları, radyo düğmeleri vb. etkileşim mekanizmaları HTTP istek-
yanıt paradigmasına dayalı olarak web uygulamalarında kayıt, login, güncelleme,
yorum vb. pek çok işlemde kullanılmaktadır.
Form kontrolleri istenen formatta veya değerde veri girişini gerçekleştirmek
(form doğrulama) ve kullanıcıyı bu yönde zorlamak için programlanabilir. Ayrıca
form elemanları normal veya görme engelli kullanıcılara yönelik olarak bu
elemanların amaçlarını açıklayan metin etiketleriyle eşleştirilebilir. Bu sayede
sağlıklı bir bilgi alışverişi gerçekleştirilmiş olur. Formlar <form> ve </form>
etiketleri arasına form elemanlarının yerleştirilmesi ile oluşturulur.
HTML formlarında veri toplamak için kullanabileceğiniz farklı form elemanları
vardır. Bunlardan bazıları:
• Input: Type öz niteliğinin varsayılan değeri text’tir.

70
WEB PROGRAMLAMA 2

Şekil 6. Input Form Elemanları

71
• Select
Bir açılır liste oluşturmak için kullanılır.

<select name=”select_ismi”>
<option value=”deger1”> Görünen Değer 1 </option>
<option value=”deger2”> Görünen Değer 2 </option>
<option value=”deger3”> Görünen Değer 3 </option>
</select>

• Textarea
Cok satırlı bir metin giriş elemanı tanımlar.

<textarea name=”txt_isim” rows=”10” cols=”30”></textarea>


Her form ögesine bir ad verilir ve form ögelerindeki değerler ad/değer çiftleri
olarak GET veya POST kullanılarak HTTP istek mesajında ​​sunucuya gönderilir. Form
Method niteliği, verilerin nasıl gönderildiğini tanımlar. Bir form gönderildiğinde
bir http isteği gerçekleştirilir. Bu istek formun action öz niteliğinde tanımlanan
bir URL’ye yapılır ve isteğin türü (GET veya POST) formun method öz niteliğinde
tanımlanır. Tarayıcı http protokolü ile başlık ve gövde verisinden oluşan bir isteği
ilgili URL’ye gönderir. Verilerin HTTP isteğinin gövdesinde gönderildiği yöntem
POST, gövdenin boş olduğu, gönderilen verilerin URL’ye eklenip gönderilmesi ise
GET metodu ile gerçekleştirilir.
Get ile gönderim de url => [Link]/?ad=Ali&Yas=40 (Form verileri
url de gözükür durumdadır) şeklindedir. ? karakteri ile query string olarak
adlandırılan verilerin başlayacağı belirtilir. Her bir ad/değer çifti & karakteri ile
ayrılmış durumdadır. (Yukarıda Ad ve Yas değişkenleri sıra ile Ali ve 40 değerlerini
almıştır)
Post ile gönderim de url => [Link] biçimindedir (form verileri http
istek gövdesinde).
Anahtar Kavram POST metodu URL’de görüntülenmesi istenmeyen istekler için kullanılırken
Manipülasyon: Sözlükte bu
get metodunda istekler URL de gözükür ve manipüle edilebilir. Dolayısı ile POST
kelime yönlendirme, seçme,
ekleme ve çıkarma yoluyla bilgileri metodu daha güvenlidir. POST metodu GET metoduna göre daha yavaştır. GET
değiştirme, kullanma ve harekete metodu belirli karakter uzunluğunda (maksimum 2048) veri gönderilebilirken,
geçirme, hileli yönlendirme anlam-
larınna gelmektedir. POST’da böyle bir limit yoktur. POST ile dosya tarzı formatlar (resim vb.)
sunucuya upload edilebilirken GET ile bu mümkün değildir. Son olarak GET
metodu ile yapılan form işlemlerine ait kayıtlar tarayıcı geçmişinde saklanırlar
böyle bir saklama POST metodu için gerçekleşmez.
Form sunucuya gönderildiğinde (Get ya da Post) kullanıcı tarafından
sağlanan tüm veriler bir kerede sunucuya gönderilir. Sunucu tarafında kullanılan
programlama dili ve frameworke uygun olarak ad/değer şeklinde gönderimi
gerçekleştirilen form verilerine erişim gerçekleşir.

72
WEB PROGRAMLAMA 2

Formlar <form> ve </form> etiketleri arasına yerleştirilen form elemanları


şeklinde oluşturulur. Bir <form> ögesi içindeki her element (<input>, <select> vb.)
bir name niteliğine ve bu name niteliğine ait değere sahiptir (form gönderildiğinde
ilgili elemana ait name niteliğine ait değer, kullanıcının o elemana verdiği yanıttır).
Metin tabanlı girdiler için bu değer, alana yazılan değer iken radio ya da select
elemanları için bu değer, seçilen seçenektir. Yani kullanıcı istenen seçenekler
dâhilinde veri girişine zorlanabilir. Bu, değerlerin kullanıcı girişiyle belirlendiği
bir ad-değer çiftleri kümesi oluşturur. Action özelliği formda girilen bilgilerin
gönderileceği adresi, method özelliği ise form bilgilerinin hangi yöntemle (Get
ya da Post) server’a gönderileceğini belirler. Form da action’ın tanımlı olmadığı
durumda gönderim varsayılan olarak aynı sayfaya gerçekleştirilir. Method özelliği
tanımlı değilse gönderim varsayılan olarak Get ile gerçekleşir. Örnek bir form
aşağıda gösterilmiştir.

<form action=”Home\isle” method=”POST”>

AD: <input name=”ad” >


YAŞ: <input name=”yas” >
<input type=”submit” value=”Gönder” />
Anahtar Kavram
</form> Asenkron: Başlama ve bitiş
Bazı web uygulamalarında asenkron HTTP istekler ile sayfayı yeniden zamanları ayrı olan, aynı zamanda
olmayan, eş zamansız anlamın-
yüklemeyen sadece bazı bölümleri yükleyen “sahne arkası” çağrıları çalıştırmak
dadır.
için Javascript kullanır.

4.2. Örnek Form Uygulaması


Önceki bölümlerde de belirttiğimiz gibi yeni bir [Link] CORE Web App
(Model- View-controller ) projesi oluşturuyoruz.
Solution Explorer kısmında yer alan Model klasörüne sağ tıklayıp Add >>Class
seçeneği ile [Link] isminde bir class oluşturup Ogrenci class’ını tanımlıyoruz.
([Link] altındaki tüm özellikler(properties) public olarak tanımlanmıştır).
public class Ogrenci
{
public string OgrAd { get; set; }
public string OgrSoyad { get; set; }
public string OgrNo { get; set; }
public int OgrYas { get; set; }
}
[Link] isminde yeni bir Controller ekliyoruz (Solution Explorer
kısmında Controller klasörüne sağ tıklayıp Add>>Controller dan sonra boş bir
MVC controller seçeneğini seçiyoruz). View altında OgrenciController’ına ait
görünümleri yerleştirmek için Ogrenci klasörü oluşturuyoruz (Solution Explorer
kısmında yer alan View klasörüne sağ tıklayıp Add >>New Folder seçeneği ile). Bu

73
Ogrenci klasörünün altında da [Link] isimli bir view oluşturuyoruz (Ogrenci
klasörüne sağ tıklayıp Add>>View den sonra boş bir Razor görünüm).

Görsel 24. Oluşturulan dosyalardan sonra solution explorer

Ogrenci altında oluşturulan [Link] dosyasına bir öğrenciye ait verileri


alabileceğimiz bir form tanımlıyoruz. Aşağıdaki kodlar incelendiğinde forma
ait ad, soyad ve numara verilerinin kullanıcıdan alındığı ve submit butonu ile
gönderimin sağlanacağı bir form tasarlanmıştır. Form OgrenciController altındaki
Kaydet() action’ına gönderim için ayarlanmış, gönderim metodu olarak Post
seçilmiştir.

<form method=”post” action=”..\Ogrenci\Kaydet”>


<table>
<tr>
<td>Ad </td>
<td>: </td>
<td><input type=”text” name=”ad” /></td>

74
WEB PROGRAMLAMA 2

</tr>
<tr>
<td>Soyad </td>
<td>: </td>
<td><input type=”text” name=”soyad” /></td>
</tr>
<tr>
<td>Numara </td>
<td>: </td>
<td><input type=”text” name=”numara” /></td>
</tr>
<tr>
<td colspan=”3” align=”center”><input type=”submit” value=”Gönder”
/></td>
</tr>
</table>
</form>
İlk etapta sadece verilerimizin gelip gelmediğini kontrol edelim.
OgrenciController’ı altına Kaydet() isimli bir action oluşturalım. Ve bu action’ın
başına HTTP POST isteklerine yanıt veren bir yöntem olan [HttpPost] ekleyelim.
Ayrıca Kaydet() action’ında form elemanına ait verileri almak için HttpContext.
[Link][“form_elemani_adi”] kodunu kullanalım ve txt isimli bir değişken
ile gelen tüm string verilerini birleştirelim (C#’da string verilerini birleştirirken +
operatörü kullanılabilir).
using [Link];
using System;
using [Link];
using [Link];
using [Link];

namespace [Link]
{
public class OgrenciController : Controller
{
public IActionResult Index()
{
return View();
}
[HttpPost]
public string Kaydet()
{
string ad = [Link][“ad”];

75
string soyad = [Link][“soyad”];
string no = [Link][“numara”];
string txt = ad + “ “ + soyad + “ “ + no;
return (txt);
}
}
}
Projemiz çalışırken varsayılan olarak Home/Index çağrılarak çalışmaktaydı.
Bunu da düzenleyerek Ogrenci/Index şeklinde çalışmasını sağlayalım. Bunun için
Solition Explorer kısmından [Link] içinde aşağıdaki değişikliği yapalım.
[Link](endpoints =>
{
[Link](
name: “default”,
pattern: “{controller=Ogrenci}/{action=Index}/{id?}”);
});
Projemizi çalıştırdığımızda OgrenciController’ı içinde index action’ı
çalıştırılacak, bu action da ogrenci klasoru altındaki [Link] dosyasını
işletilecektir.
Solition Explorer kısmında yer alan Shared klasörü altındaki_Layout.
cshtml’de yer alan…
<div class=”[Link]-collapse collapse d-sm-inline-flex justify-content-
between”>
<ul class=”[Link]-nav flex-grow-1”>
<li class=”nav-item”>
<a class=”nav-link text-dark” asp-area=”” asp-controller=”Home” asp-
action=”Index”>Home</a>
</li>
<li class=”nav-item”>
<a class=”nav-link text-dark” asp-area=”” asp-controller=”Home” asp-
action=”Privacy”>Privacy</a>
</li>
</ul>
</div>
Projede menümüzü oluşturan yukarıdaki kısmı aşağıdaki gibi güncelleyelim.
Bu güncelleme ile yapılan Ogrenci Ekle isimli bir menü oluşturup, buna
tıklandığında Ogrenci/Index çağrımını gerçekleştirmektir.
<div class=”[Link]-collapse collapse d-sm-inline-flex justify-content-
between”>
<ul class=”[Link]-nav flex-grow-1”>
<li class=”nav-item”>
<a class=”nav-link text-dark” asp-area=”” asp-controller=”Ogrenci”

76
WEB PROGRAMLAMA 2

asp-action=”Index”>Öğrenci Ekle
</a>
</li>
</ul>
</div>
Projemizi çalıştırıp formu gönderdiğimizde form OgrenciController’i altındaki
Kaydet action’ına gönderilmiş olur. Burada Kaydet içinde tüm gönderilen form
elemanlarına ait veriler alınmıştır. Alınan veriler bu örnek için sadece ekrana
basıldıysa da bu verilerin veri tabanına kayıt, doğrulama vb. işlemlerde de
kullanılabileceğini unutmayınız.

Görsel 25. Formun Post metodu ile gönderilip karşılanması

[Link] yazıp kendimiz direk action’ı


çağırsaydık Kaydet action’ı üzerine eklediğimiz [HttpPost]’dan dolayı HTTP Error
405 hatası ile karşılaşırdık.
Kodumuzda Post yerine Get kullanalım. Ogrenci klasörü altında [Link]
içinde tanımladığımız form da metodu get yapalım.
<form method=”get” action=”..\Ogrenci\Kaydet”>
Ayrıca Kaydet() action’ında Get isteklerini karşılayan [HttpGet] kodu ekleyelim
ve Kaydet() action’ında form ile gönderilen form elemanlarına ait verileri almak
için [Link][“form_elamı_adi”] kodunu kullanalım ve txt
isimli bir değişken ile gelen tüm string verilerini birleştirelim.

[HttpGet]
public string Kaydet()
{
string ad = [Link][“ad”];
string soyad = [Link][“soyad”];
string no = [Link][“numara”];
string txt = ad + “ “ + soyad + “ “ + no;
return (txt);
}
}

77
Projemizi çalıştırıp formu gönderdiğimizde form Get metodu ile
OgrenciController’i altındaki Kaydet action’ına gönderilmiş olur. Görsel [Link]
görüldüğü gibi Get metodu ile gönderimde, gönderilen tüm form verileri url’de
gözükmektedir. NOT: Bu url’de veriler üzerinde değişiklik yaptığınızda değişikliğin
aldığınız veriler üzerine de yansıdığını görebilirsiniz.

Görsel 26. Formun Get Metodu ile Gönderilip karşılanması

4.3. Model Binding (Model Bağlama)


.Net projelerinde HTTP isteklerinden gelen değerlerin Model yapısı ile
eşleştirilmesi işlemine Model bağlama (binding) adı verilmektedir. Böylelikle
action yöntemlerinde ve Razor içinde verilere kolay erişim sağlanır. Model
bağlama ile Controller’lar ve sayfa işleyicileri C# tür ve verilerini incelemek
zorunda kalmadan verileri otomatik olarak gelen istekten alır.
Model bağlama, bir HTTP isteğindeki verileri controller’daki action metodun
parametreleri ile eşler. Bu parametreler int, string vb. basit veri tipinde olabileceği
gibi bir sınıfa ait nesneler (Ogrenci, personel vb. sınıflara ait nesneler) de olabilir.
Eşleme, gelen ve karşılanan değişkenlerdeki adlar ile gerçekleşir. Örneğin sorgu
dizesi, (örneğin ogrAd adlı bir parametre içeriyorsa) action yönteminde aynı adla
(büyük/küçük harf önemli değil) bildirilen bir parametre, gönderilen değerle
otomatik olarak eşlenir.
[Link]
Aşağıdaki HomeController’ı altındaki DegerAl () action yöntemi, yukarıdaki
istek URL’sini işler ve100 değerini id parametresine ve ogrAd değerini ogrAd
parametresiyle eşler.

public string DegerAl(int? id, string ogrAd)


{
return “id = “ + [Link]() + “ and Ad = “ + ogrAd;
}
Yukarıda yaptığımız form örneğini model bağlama ile Ogrenci modelimize
bağlayalım. Modeliniz içinde [Link] isimli bir class’ımız mevcuttu.
public class Ogrenci
{

78
WEB PROGRAMLAMA 2

public string OgrAd { get; set; }


public string OgrSoyad { get; set; }
public string OgrNo { get; set; }
public int OgrYas { get; set; }
}
Bunun için View >> Ogrenci>> [Link] içinde oluşturduğumuz formda,
tüm elemanların isimlerinin Ogrenci sınıfına ait özellik (property) adları ile
eşleşmesi gerekmektedir (büyük-küçük harf duyarlı değil). Aşağıda tüm form
elemanlarına ait name’lerin Ogrenci class’ına ait özellikler(properties) ile aynı
isimli olduğuna dikkat edin.
<form method=”POST” action=”..\Ogrenci\Kaydet”>
<table>
<tr>
<td>Ad </td>
<td>: </td>
<td><input type=”text” name=”OgrAd” /></td>
</tr>
<tr>
<td>Soyad </td>
<td>: </td>
<td><input type=”text” name=”OgrSoyad” /></td>
</tr>
<tr>
<td>Numara </td>
<td>: </td>
<td><input type=”text” name=”OgrNo” /></td>
</tr>
<tr>
<td colspan=”3” align=”center”>
<input type=”submit” value=”Gönder” / >
</td>
</tr>
</table>
Projemizi çalıştırıp formu gönderdiğimizde form önceki örneklerde olduğu
gibi OgrenciController’i altındaki Kaydet action’ına gönderilecektir. Kaydet
aciton metodunda yer alan Ogrenci sınıfına ait ogr nesnesi gelen Post değerine ait
değişkenlerle eşleştirilir.
[HttpPost]
public string Kaydet(Ogrenci ogr)
{
string txt = [Link] + “ “ + [Link] + “ “ + [Link];
return (txt);

79
}
Yukarıdaki örneğimizde modelimizde yer alan fakat model bağlamada
kullanmadığımız integer tipinde bir yaş değişkeni olduğunu unutmayalım. Ogr
nesnesi altındaki bu özellik bağlama işlemine katılmadığından bağlama ardından
değeri 0 olacaktır.
Özetleyecek olursak model bağlama yaygın olarak aşağıdaki şekilde kullanılır:
• Route Değerleri: {controller}/{action}/{id} şeklinde tanımlı bir yapıda
Home/Kaydet/5 şeklinde gelen istek id parametresi ile karşılanabilir.
public string Kaydet(int? id)
{
….
}
• Form Verileri: Gönderilen form verilerine ait model bağlama formun
gönderim şekline göre aşağıdaki gibidir:
 Querystrings: Form verilerinin GET metodu ile gönderildiği durumlarda veriler
bağlanabilir. Örneğin [Link]
gibi sorgu dizesindeki iletilen ogrAd değeri, action metodunda yer alan ogrAd
parametresi ile bağlanabilir.
[HttpGet]
public string DegerAl(string OgrAd)
{
………
}
 POST: Form verilerinin POST metodu ile gönderinin gövdesinde veri
gönderildiği durumlarda bir karşılanan parametreye uygun olarak bağlanabilir.
[HttpPost]
public string Kaydet(Ogrenci ogr)
{
}
Bunlar dışında çok az kullanılsa da HTTP header değerlerine de bağlama
işlemi gerçekleştirilebilir.

80
WEB PROGRAMLAMA 2

Bu Bölümde Ne Öğrendik?

* Web formları, kullanıcılar ile bir web sitesi veya web uygulaması arasındaki ana etkileşim noktalarından
biridir.

* Web formları, verilerin işlenmesi ve depolanması için gerekli olan birtakım verilerin kullanıcıdan
alınarak web sunucusuna gönderilmesi şeklinde çalışır.

* Form kontrolleri istenen formatta veya değerde veri girişini gerçekleştirmek ve kullanıcıyı bu yönde
zorlamak için programlanabilir.

* Bir form gönderildiğinde, bir http isteği gerçekleştirilir. Tarayıcı http protokolü ile başlık ve
gövde verisinden oluşan bir isteği ilgili URL’ye gönderir. Verilerin HTTP isteğinin gövdesinde
gönderildiği yöntem POST, gövdenin boş olduğu, gönderilen verilerin URL’ye eklenip gönderilmesi
ise GET metodu ile gerçekleştirilir.

* POST metodu URL’de görüntülenmesi istenmeyen istekler için kullanılır; GET metodu ise isteklerin URL’de
gözükmesi sebebiyle manipüle edilebilir.

* Formlar <form> ve </form> etiketleri arasına yerleştirilen form elemanları şeklinde oluşturulmaktadır.

* HTTP isteklerinden gelen değerlerin model yapısı ile eşleştirilmesi işlemi model bağlama (binding)’dır.

81
Kaynakça
[Link] [Link]

[Link] [Link]
ding/
[Link]
[Link] [Link]
tnet-development/model-binding-asp-net-core/

82
WEB PROGRAMLAMA 2

Bölüm Soruları
1) Bir form yapısında birden çok seçenekten birini seçmek için hangi form
eleman tipi kullanılabilir?
a) Radio
b) Check
c) Text
d) Mail
e) Submit

2) Bir form yapısında var olan seçeneklerden birden fazla seçim yapmak
için hangi form eleman tipi kullanılabilir?
a) Radio
b) Check
c) Text
d) Mail
e) Submit

3) Input alan tiplerinin belirlenmesi için kullanılan öz nitelik aşağıda yer


alan seçeneklerden hangisinde doğru olarak verilmiştir?
a) Status
b) Form
c) Type
d) Method
e) Value

4) Asp Net Core uygulamalarında formlar hangi yapı içerisinde kullanılır?


a) View
b) Component
c) Model
d) Class
e) Razor

5) Form gönderildiğinde kullanıcılar tarafından görülemeyen veya


değiştirilemeyen verileri kullanmak için hangi form elemanı
kullanılabilir?
a) <input type="hidden">
b) <input type="text">
c) <input type="radio">
d) <input type="value">
e) <input type="check">

83
6) Input form elemanında tpye öz niteliği tanımlanmadığı durumda bu öz
niteliğin varsayılan değer ne olur?
a) hidden
b) text
c) radio
d) textarea
e) reset

<form action="\Home\Kaydet">

AD: <input name="ad" >


YAŞ: <input name="yas" >
<input type="submit" value="Gönder" />
</form>

7) Yukarıdaki form gönderildiğinde hangi contoller ve action’a hangi


yöntem ile gönderilir?
a) HomeController Index action - POST
b) HomeController Index action – GET
c) HomeController Kaydet action - POST
d) HomeController Kaydet action – GET
e) DefaultController Home action - POST

84
WEB PROGRAMLAMA 2

8) Bir Post işlemi gerçekleştiğinde post işlemini karşılayacak bir metot nasıl
tanımlanabilir?

[HttpGet]
a) public string Kaydet()
{
return (“deneme”);
}

[HttpPost]
b) public string Kaydet()
{
return (“deneme”);
}

public string Kaydet()


c) {
return (“deneme”);
}

public string HttpPost()


d) {
return (“deneme”);
}

e) public string Post()


{
return (“deneme”);
}

85
9) [Link] şeklinde gelen isteği karşılayacak
metot nasıl tanımlanabilir?

a) public string Kaydet(int? id)


{
return (“deneme”);
}

b) public string Kaydet()


{
return (“deneme”);
}

public string Home()


c) {
return (“deneme”);
}

public string Home(int? id)


d) {
return (“deneme”);
}

e) public string Home(id)


{
return (“deneme”);
}

86
WEB PROGRAMLAMA 2

10) Yandaki form <form method=”POST” action=”..\User\Kaydet”>


elemanları bir model <table>
ile bağlanmak <tr>
istendiğinde <td>Ad </td>
model aşağıdaki <td>: </td>
<td><input type=”text” name=”UserAd” /></td>
seçeneklerden hangisi
</tr>
olabilir? <tr>
<td>Soyad </td>
<td>: </td>
<td><input type=”text” name=”UserSoyad” /></td>
</tr>
<tr>
<td colspan=”3” align=”center”>
<input type=”submit” value=”Gönder” / >
</td>
</tr>
</table>

public class User


{
public string UserAd() { return (“deneme”);}
a) public string UserSoyad() { return (“deneme”);}
}

public class User


{
public string Ad { get; set; }
b) public string Soyad { get; set; }
}

public class User


{
c) public string UserAd { get; set;}
public string UserSoyad() { return (“deneme”);} }
}

public class User


d) {
public string UserAd() { return (“deneme”);}
public string UserSoyad { get; set; }
}

public class User


{
public string UserAd { get; set; }
e) public string UserSoyad { get; set; }
}

Cevaplar
1-a 2-b 3-c 4-a 5-a 6-b 7-d 8-b 9-a 10-e

87
88
5. DURUM YÖNETİMİ VE VIEW’E VERİ AKTARIMI
Kod, espri gibidir. Açıklamak zorundaysanız
kötüdür.
Cory House
Ders videosunu izlemek için
QR kodu taratın.

Kazanımlar Birlikte Düşünelim


• Durum yönetimi kavramını öğrenebilir.
• İstemci ve sunucu taraflı durum yönetim tekniklerini bilebilir 1. Durum yönetimi nedir?
ve uygulayabilir.
• Asp Net Core MVC uygulamalarında view’lere veri aktarımını 2. Durum yönetim teknikleri neler-
gerçekleştirebilir. dir?

Başlamadan Önce 3. [Link] Core uygulamalarında


Önceki bölümde ele alınan form işlemleri ve model bağlama veriler sayfalar arasında nasıl
konularından sonra bu bölümde durum yönetim kavramı incelenecek taşınabilir?
ve View’e veri aktarımının nasıl gerçekleştirilebileceği tartışılacaktır.
HTTP, bir isteğin kendinden önce yürütülen istekler hakkında bilgi 4. Asp Net Core uygulamalarında
sahibi olmadığı stateless (durumsuz) bir protokoldür. Durum bilgisi controller’lardan view’lere veri
olmayan bir protokolde, her bir istek sanki ilk defa yapılıyormuşçasına akışı nasıl gerçekleştirilebilir?
değerlendirilir. HTTP’nin durumsuz olması, istemcinin sunucuya art
arda istek gönderdiği ve önceki istekler hakkında bilginin saklanmasını
gerektiren (kullanıcılara özgü çeşitli sayfa içeriklerinin oluşturulduğu
ya da çeşitli özelleştirilmelerin yapıldığı) bazı uygulamalarda sorun
yaratabilir. Bu tip durumlarda ilgili verinin sayfalar arasında iletilmesi
gereklidir. 89
5.1. Durum Yönetimi (State Management)
Web tarayıcısı ve sunucular için ağ protokolleri durumsuz protokol (Stateless
Protoco-Örnek HTTP-UDP-DNS) ve durum bilgili protokol (Stateful Protocol-
Örnek FTP, TCP, SMTP) olmak üzere iki türe ayrılır. Bu iki protokol, durum
veya oturum bilgilerini kaydetmek için sunucu veya sunucu tarafı yazılımının
gerekliliğine göre farklılık gösterir. Protokolü durumsuz yapan şey birden çok
istek üzerinden durumu izlemesi gerekmemesidir. Bu olay çoğu durumda istemci-
sunucu arasında aktarılması gereken veri miktarını azaltır ve bu ikili arasındaki
sözleşmeyi basitleştirir.
HTTP, stateless (durumsuz) bir protokol olarak adlandırılır, çünkü her
komut isteği, kendisinden önce yürütülen istekler hakkında herhangi bir bilgi
olmadan bağımsız olarak yürütülür. Web sayfası için her istek, kendisinden
önceki bağlantılarla hiçbir ilişkisi olmayan benzersiz ve bağımsız bir bağlantı
olarak değerlendirilir. Durum bilgisi olmayan bir protokol, sunucunun birden
çok istek süresince her bir kullanıcı hakkındaki bilgileri veya durumu saklamasını
gerektirmez. Ancak web sayfası içeriğinin kullanıcılara özgü olduğu bazı web
uygulamalarında kullanıcı ilerlemesi, tercihleri vb. sayfadan sayfaya izlenmek
istenebilir ya da sayfa içeriğinin kullanıcılara göre özelleştirilmesi arzu edilebilir.
Bu tip durumlarda ilgili verinin sayfalar arasında iletilmesi gereklidir.
Bu durum state management (durum yönetimi) ile ifade edilmektedir.
Herhangi bir uygulama için (masaüstü, web vb.) durum(state) kavramı, bir
uygulamanın kullanıcı hakkında ne bildiği (kullanıcı kim, uygulamada nerede,
yapılandırma tercihleri neler vb.), kullanıcıların uygulama ile mevcut etkileşimi
vb. bilgi parçalarıdır.
Bir web sayfası görüntülemek isteyen bir kullanıcı sunucudan cevabı alıp
aynı sunucudan başka bir sayfa talep ederse bu her seferinde yeni bir istek olarak
değerlendirilir ve web sunucusu kullanıcının kim olduğu, daha önce ona başka bir
sayfa gönderip göndermediği, gönderdi ise hangi sayfaları gönderdiği hakkında
bir fikir sahibi değildir. Bu noktada sunucu tarafından, istemde bulunanın kim
olduğuna dair birtakım bilgileri hatırlamak için, bazı teknikler kullanılmalıdır.
Web uygulamalarının çoğunda bu işlem, istemci taraflı durum yönetimi (client-
based state management), sunucuda taraflı durumu yönetimi (server-based
state management) şeklinde veya her ikisinde birlikte kullanıldığı seçenekler ile
gerçekleştirilir. Aşağıda [Link] Core uygulamalarında durum yöntemi olarak
kullanılabilecek teknikler açıklanmıştır.

5.1.1. İstemci Taraflı Durum Yönetimi (Client-Based State


Management)
Kullanıcı ile sunucu arasında gerçekleşen etkileşim hakkındaki bilgilerin
istemcinin makinesinde veya sayfanın kendisinde saklanmasının bir yoludur.
Bu yaklaşım ile sunucu kaynakları işlem sırasında kullanılmaz. İstemci taraflı
durum yönetim tekniklerinde veriler istemci tarafında tutulduğundan manipüle
edilebilir haldedir. Önemli verilerin bu yöntemler ile tutulması tercih edilen bir
90
WEB PROGRAMLAMA 2

yöntem değildir. Genel olarak istemci taraflı kullanılan durum yönetimi teknikleri
aşağıda açıklanmıştır:

Şekil 7. İstemci Taraflı Durum Yönetimi Teknikleri

Query String (Sorgu Dizisi): Sayfa URL’sinin sonuna eklenen bir dizedir.
Sorgu dizeleri, verileri bir web sayfasından diğerine göndermek için çok
basit bir tekniktir. & karakteri kullanarak birden çok değer ayrılabilir. Sorgu
dizesindeki bilgiler, tarayıcının adres satırında doğrudan kullanıcı tarafından
görülüp editlenebilir olduğundan sorgu dizeleri güvenli değildir. Ayrıca birçok
tarayıcıda URL için belirli bir karakter sınırı uygulanır. (Örneğin url => www.
[Link]/?user=ali&limit=10) NOT: 4. bölümde form verilerinin get metodu ile
gönderiminde sorgu dizelerinden veri elde etme örnek ile açıklanmıştır.
Hidden Fields: Gizli alanlar, <input type=”hidden”> şeklinde html form
yapısı ile gönderilen verilerdir. Veriler, gizli form alanlarına kaydedilebilir ve
bir sonraki istekte geri gönderilebilir. Çok sayfalı form uygulamalarında yaygın
olarak kullanılır. İstemci tarafında web sayfasında kaynağı görüntüle işlemi ile
gizli alanlar ve onlarda yer alan değerler görüntülenebilir. İstemci potansiyel
olarak verileri kurcalayabileceğinden ve postman vb. uygulamalar ile var olan
hidden değişken değerlerini manipüle edebileceğinden uygulama tarafından gizli
alanlarda depolanan verilerin her zaman yeniden doğrulaması gerekir.
HTTP Cookies (Çerezler): Bir sunucunun kullanıcının web tarayıcısına
gönderdiği küçük veri parçalarıdır. İstemci bilgisayarda metin dosyaları halinde

91
depolanırlar. Çerezler, her istekte sunucuya gönderildiği için boyutları minimumda
tutulmalıdır. İdeal olarak uygulama tarafından depolanan verilerle birlikte bir
çerezde yalnızca bir tanımlayıcı saklanmalıdır. Çoğu tarayıcı, çerez boyutunu
4096 bayt ile sınırlar. Tanımlama bilgileri genellikle içeriğin bilinen bir kullanıcı
için özelleştirildiği kişiselleştirme için kullanılır. Kullanıcı yalnızca tanımlanır ve
çoğu durumda kimliği doğrulanmaz. Tanımlama bilgisi, kullanıcının adını, hesap
adını veya Id gibi benzersiz kullanıcı kimliğini saklayabilir. Çerezler daha çok, web
sitesi arka plan rengi gibi kullanıcı tercihlerinde, kullanıcıya ait kişiselleştirilmiş
ayarlara erişmek için kullanılabilir.
Çerez kullanımının bazı dezavantajları vardır. Bir kullanıcı, tarayıcı ayarlarını
kullanarak çerezleri devre dışı bırakabilir, silebilir ve değiştirebilir. Bundan
dolayı istenen durum yönetimi gerçekleşmemiş olur. Ayrıca çerezler kullanıcı
bilgisayarında saklandığından bilgisayara erişen her kullanıcı tarafından
görülebilir haldedir. Bu nedenle hassas bilgilerin çerezlerle saklanması pek
uygun değildir.
[Link] Core Mvc uygulamalarında cookie(çerez) kullanımı için Microsoft.
[Link] namespace’i projeye eklenmelidir.
[Link](“CookieName”,”value”); kodu ile
CookieName isminde bir çerez oluşturulmuş ve değerine value atanmıştır. Bu değer
sunucuya istemde bulunulan tarayıcıda oluşturulmuş olur. Sunucu tarafından
bu değer uygulamanın çeşitli bölümlerinde var name = [Link].
Cookies[“CookieName”]; ile alınabilir. Tarayıcı, her istekle ilgili tüm çerezleri
otomatik olarak gönderdiğinden ilgili istekten (request) çerez elde edilmiş olur.
Yukarıda kullandığımız Append() yöntemine isteğe bağlı bir üçüncü parametre
olarak, CookieOptions sınıfının bir örneği verilebilir. Bu özellik çerezin ne kadar
süre hayatta kalacağı ve hangi etki alanlarında kullanılacağı vb. tanımlar içerir.
var cookieOpt = new CookieOptions
{
Expires = [Link](10),
Domain = “.[Link]”
};

[Link](“CookieName”, [Link],
cookieOpt);
Yukarıdaki tarayıcıda 10 dakika sonra kendini yok edecek [Link]
etki alanında erişilebilecek CookieName isimli bir çerez oluşturulmuştur.
CookieOptions’da Secure, Path vb. farklı özellikler de mevcuttur.

5.1.2. Sunucu Taraflı Durum Yönetimi (Server-Based State


Management)
Sunucu tarafı durum yönetimi ile veriler sunucu üzerinde saklandığından
daha güvenlidir. Ayrıca bu yöntem ile veriler sunucu üzerinde yer aldığından

92
WEB PROGRAMLAMA 2

istemci tarafı durum yönetiminde olduğu gibi verilerin her seferinde sunucuya
gönderilmesine gerek kalmaz, bu sebeple performans olarak da daha iyidir.
Session State: Session (Oturum) işlemi, geliştiriciler tarafından uygulamanın
durumunu korumak için kullanılan en yaygın yollardan biridir. Bir web oturumu,
bir kullanıcının ilk sayfaya gelip siteden ayrıldığı ana kadar web sitesinde gezinmek
için harcadığı süredir. Her kullanıcı bir siteye ilk ziyaretini gerçekleştirdiğinde
(Kullanıcı aynı makine üzerinden farklı tarayıcılar ile bağlantı gerçekleştirdiğinde
her bir bağlantı ayrı oturum olarak değerlendirilir) kendi için benzersiz bir oturum
bilgisi atanır ve her oturumun benzersiz bir kimliği (ID) vardır. Bu oturum, bir
web sitesi veya web uygulamasında kullanımı boyunca kalıcı olan verilerden veya
dosyalardan oluşur. Örneğin kullanıcı adı Session’a kaydedilerek her sayfada veri
tabanına tekrar tekrar bağlanmak zorunda kalmadan sayfalar arasındaki geçişte
kullanılabilir.
Session değişkenleri web sunucusu tarafından geçerli kullanıcı için yerel
olarak depolanan bellek değişkenleri olarak düşünülebilir. Yani oturum
değişkenleri sunucu üzerindeki bir klasörde, istekleri karşılayan prosesin
hafızasında veya veri tabanında saklanabilir.
Web oturumları, web sitesinin bir kullanıcının etkinliği hakkında bir tür “kısa
süreli belleğe” sahip olmasına izin verir. Bir web uygulamasına erişen birden
fazla kullanıcı varsa, her kullanıcı için ayrı bir oturum (Session) oluşturulur. Bir
session değişkeni, web uygulamasının amacına bağlı olarak kullanıcının ziyareti
sırasında kullanıcı adı, yetki seviyesi vb. çeşitli bilgiler içerebilir.
[Link] Core uygulamalarında bu kullanıcının ilk isteğinden sonra oluşturulan
kimlik bilgisi (Session ID), çerezler kullanılarak istemci makinesine sunucunun
sadece kendisinin bildiği bir anahtar ile şifreleyerek gönderilir. İstemci tarafında
da çerez bilgisi olarak saklanan bu bilgi tarayıcının yaptığı sonraki isteklerde web
uygulama tarafından çözümlenerek Session Id bulunur. Böylece bir kullanıcıya
ait oturum bilgisi yazılımcı tarafından oluşturulan Session değişkenleri ile
eşleşmiş olur. Uygulama, son istekten sonra sınırlı bir süre için bir oturumu korur.
Uygulama, oturum zaman aşımını ayarlar. Bu varsayılan olarak 20 dakikadır ve
gerekli ayarlar ile düzenlenebilir. Oturumlar tarayıcılar arasında paylaşılmaz.
Projede .Net Core 2.0 veya daha düşük versiyon kullanılıyorsa ilk olarak
Nuget’ten yükleme paketi’nden [Link] yüklenmelidir.
[Link] dosyasında ConfigureServices metoduna [Link]();
eklenmelidir.
public void ConfigureServices(IServiceCollection services)
{
[Link]();
[Link]();
}
Yine [Link] dosyasında Configure metoduna [Link]();
eklenmelidir.

93
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
//Burada başka kodlar
[Link]();
//başka kodlar

}
İlgili Controller class’ında [Link]; namespace’i
eklenmelidir.
Yukarıdaki işlemler ile Session desteği etkinleştirildiğinde, HttpContext
üzerindeki Session özelliğine erişerek kullanılmaya başlanabilir. Microsoft.
[Link] namespace eklendiğinde, verileri oturum verileri olarak almak
ve depolamak için kullanılabilecek SetString, SetInt32, GetString, GetInt32 gibi
Isession metotları kullanıma hazır hale gelir.
[Link](“SessionUser”, “deger”);
Karmaşık türler, kullanıcı tarafından JSON gibi başka bir mekanizma
kullanılarak serileştirilmelidir. (Json için ilgili namespace eklenmelidir - using
[Link];)
[Link](key, [Link](value));

5.2. Örnek bir Session ve Cookie Uygulaması


Görsel [Link] görüldüğü gibi Ana Sayfa, İçerik ve Çıkış şeklinde üç menüsü
olan örnek bir uygulama oluşturulacaktır. Kullanıcı adı ve şifre girişi yapılan
uygulamada, İçerik isimli menü içeriğine, sadece login girişi başarılı kullanıcıların
erişmesi istenmektedir. Bunun için User isimli bir sınıf ve sınıfın static liste
(burada static liste bir veri kaynağı olarak düşünülmelidir) olarak tanımlandığı
bir değişken oluşturulacaktır. Kullanıcı adı ve şifre doğru olarak girildiğinde
(static listede kontrol gerçekleştirilecek) kullanıcı için bir session ve cookie bilgisi
tanımlanacaktır. Session’da kullanıcı adı, cookie’de kullanıcın tercih ettiği renk
yer alacaktır.

94
WEB PROGRAMLAMA 2

Görsel 27. Session-Cookie Uygulaması Görünümü

İlk olarak bir [Link] Core MVC projesi oluşturalım. Yukarıda bir önceki
başlıkta anlattığımız gibi [Link] dosyasında ConfigureServices metoduna
[Link](); è Configure metoduna [Link](); kodlarını
ekleyerek session işlemini yapılandıralım. Model klasörünün altına User isimli
bir sınıf ekleyelim.
public class User
{
public string UserName { get; set; }
public string UserPass { get; set; }
public string UserColor { get; set; }
}
HomeController altına static olarak olarak Users isimli bir liste tanımlayalım.
public class HomeController : Controller
{

static List<User> Users = new List<User>()


{
new User() { UserName = “can”, UserPass = “123”,UserColor = “Green”},
new User() { UserName = “omer”, UserPass = “456”, UserColor = “Black”
}

};
// diğer metodlara ait kodlar mevcut
}
Uygulamamızda menümüzü Görsel [Link] görüldüğü şekilde _Layout.cshtm
dosyasında düzenleyelim.

95
HomeController’ı altındaki index metodunun çağırdığı view’de (View/Home
klasörü altında) bir form oluşturalım. Görüldüğü gibi form HomeController
altında Login metoduna post edilmektedir. Form sayfasına login olan bir kullanıcı
(session değeri atanmış ve geçerliliğini koruyan) bu sayfaya geldiğinde form giriş
ekranı getirilmeyecek ve kullanıcıya “Login Oldunuz“ uyarı mesajı verilecektir.
Ayrıca hatalı girişler için post verilerinin kontrol edildiği Login() action metodunda
tanımlanan bir hata mesajı burada >@[Link] ile ekrana basılmıştır.
@using [Link];
@{
ViewData[“Title”] = “Login”;
}
<h3>@[Link]</h3>
@if ([Link](“SessionUser”) is null)
{
<form action=”\Home\Login” method=”post”>
<table>
<tr>
<td>Kullancı Adı</td>
<td>:</td>
<td><input type=”text” name=”UserName” /></td>
</tr>
<tr>
<td>Şifre</td>
<td>:</td>
<td><input type=”password” name=”UserPass” /></td>
</tr>
<tr>

<td colspan=”2”><input type=”submit” value=”Gonder” /></td>


</tr>

96
WEB PROGRAMLAMA 2

</table>
</form>
}
else
{
<h2>Login Oldunuz</h2>
}
Login metodunda parametre olarak formun post metodundan gelen User
sınıfına ait usr nesnesi alınmıştır. Gelen kullanıcı adı ve şifre verisi Users
statik listesi içerisindeki veriler ile eşleniyorsa (Kullanıcı adı ve şifre doğru ise)
SessionUser isimli bir Session değişkeni ve UsrColor isimli bir cookie (çerez)
oluşturulmuş( Çerezin ömrü Expires = [Link](150) ile 150
saniye tanımlanmıştır) ve kullanıcı Giris view’ine yönlendirilmiştir (Controller’a
using [Link]; kodu ile http namaspace’inin eklenmesi
gerektiğini unutmayalım). Kullanıcı girişi başarısız ise kullanıcı tekrardan
login işlemi için Index view’ine bir hata mesajı oluşturularak yönlendirilmiştir
(ViewBag bu bölüm içerisinde ele alınacaktır).
public IActionResult Login(User usr)
{
foreach (var item in Users)
{
if ([Link]==[Link] && [Link] == [Link])
{
[Link](“SessionUser”, [Link]);

var cookieOptions = new CookieOptions


{
Expires = [Link](150),
};

[Link](“UsrColor”, item.
UserColor,cookieOptions);
return View(“Giris”);
}
}
[Link] = “Hatalı Kullanıcı”;
return View(“Index”);

}
Giris view’inde aşağıdaki kod ile sadece Session bilgisi yazdırılmıştır:
@using [Link];

97
<h2> Session : @[Link](“SessionUser”)</h2>

Ayrıca login girişi başarılı bir şekilde gerçekleşen kullanıcılar için içerik
view’ini görüntülemeye izin veren bir içerik metodu aşağıdaki kodlar ile
oluşturulmuştur. Burada session kontrolü yapılarak session’da SessionUser
değeri null ise kullanıcı index view’ine yönlendirilmiş, SessionUser var ise icerik
view’i kullanıcıya gösterilmiştir.
public IActionResult Icerik()
{

if ([Link](“SessionUser”) is null)
{
return View(“Index”);
}
return View();
}
[Link] dosyasında ise kodlar aşağıdaki gibidir.
@using [Link];
@{
var cerezRenk = [Link][“UsrColor”];
}
<h1>@ViewData[“Title”]</h1>

<p>İçerik Sadece Kayıtlı Kullancılar Görebilir</p>


<h2> Session : @[Link](“SessionUser”)</h2>
<h2 style=”color:@cerezRenk”>Cookies : @[Link].
Cookies[“UsrColor”] </h2>
Burada Session ve Cookie ekrana basılmıştır. Cookie ekrana basılırken kullanıcı
için oluşturulan cookie değeri style ile birlikte kullanılarak renklendirilmiştir.

Görsel 28. Session ve Cookie bilgilerinin alınması


98
WEB PROGRAMLAMA 2

Cookie değeri bilgisayar tarayıcısında (örnek gösterim Chrome içindir-tarayıcı


aktifken F12 tuşuna basılarak Application sekmesi tıklanmalıdır) aşağıdaki şekilde
görülebilir (Değer üzerine tıklandığında değişilebilir olduğuna dikkat ediniz):

Görsel 29. Oluşan Cookie’nin Görünümü

5.3. View’e Veri Aktarımı


Bir MVC modelinde, tüm HTTP isteklerini karşılayıp işlemek ile görevli olan
Controller çoğu zaman Action metodunda ViewResult dönüş tipi ile uygun bir
view döndürür. Bildiğimiz gibi view’ler genel olarak kendilerine bir controller
tarafından sağlanan verileri son kullanıcı ile etkileşimde bulunmak için bir
ara birim sağlayan bileşenlerdir. Dolayısı ile view’lerde herhangi bir bilgiyi
görüntülemek Controller’dan View’lere veri akışı ile gerçekleşmelidir. Verileri
View’lere aktarmanın çeşitli yolları vardır. Aşağıda bu yöntemler açıklanmıştır.

5.4. ViewBag
Genelde modele dâhil olmayan, program çalıştırılmadan önce yapısı
bilinmeyip çalışma zamanında belirlenen ve çok büyük boyutta olmayan verileri
Controller’dan View’e aktarmak için kullanılır. Controller sınıfının temel sınıfı
olan ControllerBase sınıfının dinamik bir tür özelliğidir. ViewBag özelliğine
değer olarak basit veya karmaşık tipte bir nesne atanabilir. Sadece geçerli istek
sırasında okunabilir. Yönlendirme sonrasında kendini imha eder, null değer alır.
Yani aktarımı yapıldığı view de son bulur.

Görsel 30. ViewBag veri aktarımı

ViewBag’e istenen sayıda özellik ve değer atanabilir. Aynı özellik adına birden
çok kez atama yapılmışsa son atanan değer geçerli olur. Bölüm 4’te uyguladığımız
form örneğinde başka bir view’e formun post verisinden gelen verileri aktaralım.
(Not: Model verileri bir view’e aktarılacaksa ileride bahsedilen ViewModel daha
iyi bir çözümdür.) Hatırlarsak son olarak Ogrenci Controller’ı altındaki Kaydet

99
Action metodunda yer alan Ogrenci sınıfına ait ogr nesnesi gelen Post değerine
ait değişkenlerle eşleştirmiştik. Şimdi Kaydet( ) action metodununda parametre
Anahtar Kavram olarak gelen ogr nesnesindeki özellikleri OgrenciAd, OgrenciSoyad, OgrenciYas
Parametre: Fonksyion ya da me- ismindeki ViewBag’lere aşağıdaki kodlarla atayalım. NOT: Kaydet() Action
totlara girdi olarak sağlanan veri metodunun return View() ile ViewResult tipinde aynı Action isminde (Kaydet.
parçalarındana atıfta bulunmak
için kullanılan değişken türüdür. cshtml) view döndürdüğünü unutmayın.
[HttpPost]
public ViewResult Kaydet(Ogrenci ogr)
{
[Link] = [Link];
[Link] = [Link];
[Link] = [Link];
return View();
}
View >> Ogrenci klasörü altına [Link] isimli boş bir view ekleyelim
ve Kaydet() action’ı içerisinde değer atamaları yaptığımız ViewBag’leri aşağıdaki
şekilde kullanalım:
<table>
<tr>
<td>
AD:
</td>
<td>
@[Link]
</td>
</tr>
<tr>
<td>
SOYAD:
</td>
<td>
@[Link]
</td>
</tr>
<tr>
<td>
NUMARA:
</td>
<td>
@[Link]
</td>
</tr>
</table>
100
WEB PROGRAMLAMA 2

Yazdığımız kodları çalıştırırsak programımız aşağıdaki sonuçları üretecektir:

Görsel 31. Formda Post metodu ile gönderilen verilerin ViewBag ile
aktarılması

5.5. ViewData
ViewData, Controller’dan View’e veri aktarmak için kullanılan bir başka
yöntemdir. ViewBag’e benzer fakat ViewData, Dictionary türündedir, oysa ViewBag
dinamik bir türdür. ViewData Dictionary türünde olduğundan, anahtar/değer
çiftlerini (key-value pairs) içerir. ViewData, verileri de yalnızca Controller’dan
View’e veri aktarırken sadece mevcut istek sırasında geçerlidir.

Görsel 32. ViewData Veri Aktarımı

Yukarıdaki Viewbag ile yaptığımız Öğrenci Post örneğini ViewData kullanarak


gerçekleştirelim. Kaydet action metodunu aşağıdaki şekilde güncelleyelim:
[HttpPost]
public ViewResult Kaydet(Ogrenci ogr)
{
ViewData[“Ad”] = [Link];
ViewData[“Soyad”] = [Link];
ViewData[“No”] = [Link];
return View();

[Link] view’inde Kaydet() action’ı içerisinde değer atamaları yaptığımız


ViewData’ları kullanmak için view’imizi aşağıdaki şekilde güncelleyelim:
<table>
<tr>
<td>
AD:

101
</td>
<td>
@ViewData[“Ad”]
</td>
</tr>
<tr>
<td>
SOYAD:
</td>
<td>
@ViewData[“Soyad”]
</td>
</tr>
<tr>
<td>
NUMARA:
</td>
<td>
@ViewData[“No”]
</td>
</tr>
</table>

5.6. TempData
Controller’dan view ‘e veri aktarmak için kullanılan bir başka özelliktir.
ViewData, ViewDataDictionary türünü kullanan bir Dictionary’dir. ControllerBase
sınıfının özelliklerine sahiptir. Viewbag ve ViewData bir istekten sonra
geçerliliklerini yitirirlerken, TempData ilk istek ve sonraki istek sırasında da
kullanılabilir. Daha sonra geçerliliğini yitirir.

Görsel 33. TempData Veri Aktarımı

Aşağıda ViewBag, ViewData ve TempData için benzer ve farklı olan özellikler


aşağıda listelenmiştir:

• ViewData ve TempData değerlere erişmek için dictionary söz dizimini


(key-value) kullanırken, ViewBag property söz dizimini (dot notation)
kullanır.

102
WEB PROGRAMLAMA 2

• ViewData ve TempData ile kullanılan değer, bir değişkene aktarılmak


istendiğinde tip dönüşümü yapılması gereklidir. ViewBag’de tip
dönüşümüne gerek yoktur.

@{
string msj = (string)ViewData[“Ad”];
string mj2 = [Link];
int a = (int)TempData[“No”];
}

• ViewData, ViewDataDictionary’den türetilmiştir, bu nedenle ContainerKey,


Add, Remove ve Clear gibi yararlı olabilecek özelliklere sahiptir.
• ViewBag ve ViewData yalnızca geçerli istek süresince kullanılır. Yaşam
döngüsü bir sonraki isteğe kadardır (İlk istekten sonra NULL değerlerini
alırlar), TempData geçerli ve sonraki istek sırasında da kullanılabilir. Yani
yaşam döngüsü o anki ve bir sonraki HTTP istek süresincedir.

Aşağıdaki HomeController’ı altında Index() action metodunda oluşturulan


3 viewBag, ViewData ve TempData özelliklerine değerler atanmıştır. Bu
index metodunda RedirectToAction ile belirtilen Action’a (MsjGoster) yeniden
yönlendirme gerçekleştirilir. Bu durumda, tarayıcı yeniden yönlendirme
bildirimini alır ve belirtilen action için yeni bir istekte bulunur. İkinci istek
gerçekleştiğinden MsjGoster View’i çağrıldığında sadece TempData[“Msg3”]
değerine ulaşılabilir. Diğerleri NULL’dur.

public ActionResult Index()


{
ViewBag.Msg1 = “ViewBag mesaj”;
ViewData[“Msg2”] = “ViewData mesaj”;
TempData[“Msg3”] = “TempData mesaj”;
return RedirectToAction(“MsjGoster”);
}

public IActionResult MsjGoster()


{
return View();
}

Aşağıda [Link] View’inin içeriği verilmiştir.

viewbag= @ViewBag.Msg1 <br />

103
viewdata= @ViewData[“Msg2”] <br />
tempdata= @TempData[“Msg3”]

Görsel 34. İkinci istekten sonra ViewBag, ViewData ve TempData


içerikleri

ViewData, ViewBag ve TempData, çok büyük olmayan verilerin


Controller’dan View’e aktarmak için genellikle kişisel tercihe bağlı olarak
kullanılan özelliklerdir.

5.7. Model Verilerinin Aktarılması-View Model


Çoğu uygulamada Controller’lardan view’ler gerçekleştirilecek veri akışı,
Modelde tanımlı class’lara ait nesnelerin, yani veri tipinin açıkça tanımlanıp
kullanıldığı durumlarda gerçekleşmektedir. Bu tip bu durumda derleme
zamanı denetimi sağlanmış olur. Model datası gönderilen bir view, kendisine
gönderilen dataya @model yönergesini kullanarak ulaşabilir. Modelin ViewData
vb. gönderim metotları ile kullanması durumunda modelin özellikleri çalışma
zamanında belirlendiğinden herhangi bir intellisense yardımı sağlanmaz.
Derleme zamanı türü denetimi de kullanılamaz. Bu kullanımda ise ViewModel’in
türünü belirten View dosyasının en üstüne yerleştirilen @model yönergesi ile
intellisense yardımlarından ve hata varsa derleme zamanı hata bildirimlerinden
de yararlanılmış olur. Aynı zamanda Razor sayesinde, Model özelliği bildirimi
yapılan tür döndürülür. Yani view’e gönderilen Model türü örneğin Ogrenci class’ı
için @model Ogrenci şeklinde tanımlanır. Bu ise sanki Ogrenci Model; şeklinde bir
tanıma karşılık gelir. View içinde gönderilen data kullanımı Model isimli değişken
üzerinden gerçekleşir.
Yukarıda yaptığımız form örneğinde Kaydet() action metoduna gelen ogr
nesnesini [Link] view’ine gönderelim. Burada return View(ogr); ile ogr
nesnesi Kaydet view’ine parametre olarak gönderilmektedir.
[HttpPost]

104
WEB PROGRAMLAMA 2

public ViewResult Kaydet(Ogrenci ogr)


{
//Burada veri tabanına kayıt vb. işlemler yapılabilir
return View(ogr);

[Link] view’inde gelen ogr nesnesini kullanmak için ogr nesnesine ait
dosyasının en üstüne bir @model ifadesi ekleyerek, view’in beklediği nesne türü
belirtilmiştir.
NOT: Projede kullanılan tüm viewler tarafından otomatik olarak eklenen _
[Link] dosyası kullanılarak tüm viewlere ayrı ayrı eklemek zorunda
kalmadan namespaceler projeye dahil edilebilir.
@model Ogrenci

@{
<p>Ad :@[Link] </p>
<p>Soyad :@[Link] </p>
<p>Numara :@[Link] </p>
}
@model yönergesi, türü kesin olarak belirlenmiş bir Model nesnesi kullanarak
controller’ın view’e aktardığı ogr nesnesine erişmenizi sağlar. Burada Model ve
model (biri küçük diğeri büyük harf ile başlıyor) sıklıkla karıştırılabilmektedir.
“model”, ViewModel’in türünü bildirmek için kullanılan yönerge iken, “Model”,
ViewModel’e erişmek için kullanılan bir değişkendir. Model tipi, @model anahtar
kelimesi ile bildirilir.
Gerçek zamanlı uygulamalarda, tek bir model nesnesi, ihtiyacımız olan tüm
verileri içermeyebilir. Bu gibi durumlarda [Link] Core MVC uygulamasında
ViewModel olarak adlandırılan birden fazla model verisinin beraber kullanıldığı
bir model (içerisinde birden fazla class’ın değişken olarak tanımlandığı bir class)
kullanmamız gerekir. Birden çok model nesnesini veya veri kaynağını tek bir
görünüm model nesnesinde birleştirmek bize daha iyi optimizasyon sağlar.

105
Bu Bölümde Ne Öğrendik?

* Web tarayıcısı ve sunucular için ağ protokolleri durumsuz protokol ve durum bilgili protokol olmak üzere
iki türe ayrılabilir.

* Herhangi bir uygulama için durum kavramı, bir uygulamanın kullanıcı hakkında ne bildiği,
kullanıcıların uygulama ile mevcut etkileşimi vb. bilgi parçalarını ifade etmektedir.

* Stateless (durumsuz) bir protokol olan http protokolünde gerçekleşen her istek, kendisinden önceki
bağlantılarla hiçbir ilişkisi olmadan benzersiz ve bağımsız olarak değerlendirilmektedir.

* Kullanıcılara özgü kimi web uygulamalarında kullanıcı ilerlemesi, tercihleri vb. durumlar için
özelleştirme yapılmak istendiğinde bazı verilerin uygulamanın tamamında ulaşılabilir olması
gerekebilir.

* İstemci taraflı durum yönetimi, kullanıcı ile sunucu arasında gerçekleşen etkileşim hakkındaki bilgilerin
istemcinin makinesinde veya sayfanın kendisinde saklanmasının bir yoludur.

* Sunucu taraflı durum yönetimi ile veriler sunucu üzerinde saklandığından daha güvenlidir.
Ayrıca bu yöntem ile veriler sunucu üzerinde yer aldığından performans olarak da daha iyi
sonuç vermektedir.

* Kullanıcıya ait bilgilerin istemcide ya da sunucuda saklandığı tekniklerin avantaj ve dezavantajları


bulunmaktadır.

* Controller’dan View’e veri aktarmak için çeşitli yollar bulunmaktadır. [Link], Viewdata, TempData
ve model verilerinin aktarılması olarak adlandırılan View Model yöntemleri bunlardandır.

106
WEB PROGRAMLAMA 2

Kaynakça
[Link] [Link]
net-mvc mentals/app state?view=aspnetcore-5.0

[Link] [Link]
asp-net-core-viewbag-viewdata/ Cookies

[Link] [Link]
core-model-and-viewmodel/ Asp-Net-state-management-techniques/

[Link] [Link]

[Link]
nagement

107
Bölüm Soruları
1) Aşağıdaki protokollerden hangisi durumsuz (stateless) bir protokoldür?
a) FTP
b) TCP
c) SMTP
d) HTTP
e) Yukarıdakilerin Hepsi

2) [Link]/?user=ali&limit=10 sorgu dizesinden kaç farklı


değişken ile veri tanımlanmıştır?
a) 0
b) 1
c) 2
d) 3
e) 4

3) İsmi UserId olan bir hidden alana 10 değeri verilmek istendiğinde bu


durum nasıl tanımlanabilir?
a) <form>
<input type=”text” value=”hidden” name=”UserId”>
</form>

b) <form>
<input type=”UserId” value=”hidden”>
</form>

c) <form>
<input type=”text” value=”10” name=”UserId”>
</form>

d) <form>
<input type=”hidden” value=”10” name=”UserId”>
</form>

e) <form>
<input type=”hidden” value=”10”>
</form>

5) [Link] Core MVC’de Session kullanmak için projemize hangi


namespace’i eklememiz gerekir?
a) [Link]
b) [Link]
c) [Link]
d) [Link]
e) [Link]

108
WEB PROGRAMLAMA 2

6)

public ActionResult Index() Yanda verilen kod işletildiğinde


{ ViewData verisi hangi view de
var ogr = “Hasan”;
ViewData[“Ogrenci”] = ogr; geçerli olur ve ViewDatada’daki
return View(); değer nasıl alınır?
}
@{
a) [Link] var str = (string)ViewData[“Ogrenci”];
}
@{
b) [Link] var str = (string)ViewData[“ogr”];
}
@{
c) [Link] var str = (string)ViewData[“Ogrenci”];
}
@{
d) [Link] var str = ViewData[“Ogrenci”];
}
@{
e) [Link] var str = ViewData[“Ogrenci”];
}

7) Kullanıcının renk tercihleri kullanıcı bilgisayarında saklanmak


istendiğinde aşağıdakilerden hangisini kullanmak uygun olur?
a) Session
b) Cookies
c) ViewBag
d) ViewData
e) TempData

I. Session bilgileri sunucu tarafında tutulur.


II. Cookie bilgileri sunucu tarafında tutulur.
III. ViewBag, cookie’lerin özelleştirilmiş bir halidir.

8) Yukarıdaki verilenlerden hangisi/hangileri doğrudur?


a) Yalnız I
b) Yalnız II
c) I ve II
d) II ve III
e) I,II ve III

109
9) [Link] Core projelerinde Session kullanabilmek için [Link]
dosyasında yer alan ConfigureServices metoduna aşağıdakilerden
hangisi eklenmelidir?
a) [Link]();
b) [Link]();
c) [Link]();
d) [Link]();
e) [Link]();

I. ViewData kullanıcı bilgisayarında tutulur.


II. TempData birinci istekten sonra geçerliliğini yitirir.
III. ViewBag yalnızca geçerli istek süresince kullanılır.

10) Yukarıda verilenlerden hangisi/hangileri doğrudur?


a) Yalnız I
b) Yalnız II
c) Yalnız III
d) I ve II
e) II ve III

11) [Link] Core MVC projesinde “UserName” isimli bir Session değişkene
“Auzef” değeri hangi kod ile verilebilir?
a) [Link](“UserName”, “Auzef”);
b) [Link](“UserName”, “Auzef”);
c) [Link](“UserName”, “Auzef”);
d) [Link](“UserName”, “Auzef”);
e) [Link] (“UserName”, “Auzef”);

Cevaplar
1-d, 2-c, 3-d, 4-b, 5-a, 6-b, 7-a, 8-a, 9-c, 10-c

110
6. ETİKET YARDIMCILARI (TAG HELPER)
Kullanıcıları, sistemin zaten bildiği bir bilgiyi
vermeye zorlamayın.
Rick Lemons
Ders videosunu izlemek için
QR kodu taratın.

Kazanımlar Birlikte Düşünelim


• Tag Helper kavramını öğrenebilir.
• Tag Helper avantajları hakkında fikir sahibi olabilir. 1. Tag Helper’lar nedir ve nasıl
• Yerleşik Tag Helper nesnelerini tanımlayabilir ve kullanabilir. kullanılır?
• Hazır razor view şablonları oluşturabilir.
2. Tag Helper kullanmanın avantaj-
Başlamadan Önce ları nelerdir?
Bir önceki bölümde durum yönetimi ve view’e veri aktarım yolları
hakkında ayrıntılı bilgi verildikten sonra bu bölümde etiket yardımcıları 3. [Link]. Core’da yerleşik olarak
(tag helper) ele alınacaktır. [Link] Core'un piyasaya sürülmesiyle MVC bulunan tag helper’lar nelerdir
Razor motorunda HTML elemanları oluşturmayı kolaylaştıran yeni bir ve bunlar nasıl kullanılır?
özellik olarak Tag Helper kullanılmaya başlanmıştır. Tag Helper’lar(Etiket
Yardımcıları), sunucu taraflı bileşenlerdir. Razor dosyalarında HTML 4. Hazır razor görünüm şablonları
ögeleri oluşturur. Modeldeki özellikleri view’lerdeki form ve bazı nasıl oluşturulur?
html elemanlarına bağlama noktasında zengin bir IntelliSense (akıllı
kod) desteği ile birlikte kolaylık sağlar. Derleme zamanında kontrol
edildiğinden bir hata durumunda yazılım geliştiriciyi uyarmış olur.

111
6.1. Tag Helper (Etiket Yardımcıları)
Web projelerinde oluşturulan birçok dinamik uygulama tarafından kullanıcı
ve uygulama arasındaki veri alışverişi web formları kullanarak gerçekleştirilir.
[Link] Core’un piyasaya sürülmesiyle MVC Razor motorunda HTML elemanları
oluşturmayı kolaylaştıran yeni bir özellik olarak Tag Helper’ da gelmiştir. Bu özellik
ile web geliştiriciler sunum katmanını tasarlamak için web uygulamalarında eski
geleneksel HTML etiketlerini kullanmak yerine, HTML ögelerini sunucu taraflı
oluşturan ve işleyen, tag helper kullanabilirler.
Tag helper’ler HTML’de yazılan kodlama miktarını azaltır. Ayrıca kullanıcı
arayüzünde kullanılan Razor söz dizimine yapılan eklemeler ile HTML
özelleştirilerek, sunucu taraflı kodumuz arasında soyutlanmış bir katman
oluşturulmuş olur. Gramatik olarak html etiketlerinin yapısına benzer fakat
Anahtar Kavram burada bu elemanlar C# yardımıyla oluşturulur. Bu sayede Razor ve C#’ın gücünü
Intellisense: Microsoft Visual Stu-
dio’da bulunan yerleşik bir akıllı kullanarak IntelliSense desteği ile de HTML ile çalışmayı çok basit hale getirir.
kod tamamlayıcısıdır. Program- Tag Helper’lar [Link]’in önceki sürümlerinde kullanılan Html Helper’ları
lama yaparken yapılan yazım ve hatırlatsa da daha akıcı bir söz dizimi sağladıkları için HTML Helper’ların (halen
diğer hataları azaltarak kodlamayı
hızlandırmayı sağlar. kullanımı mevcut) mantıksal halefidir. asp-* ön eki ile, bu HTML etiketinin bir tag
helper kullandığını ve sunucu taraflı kodun Razor ile HTML ögeleri oluşturacağı
bildirilir.
Aşağıda örnek HTML kodunda, kullanılan anchor (link) tag helper’ına ait
söz diziminin HTML’ye ne kadar benzediği açıkça görülmektedir (Tıkla ifadesine
tıklandığında OgrenciController’ı altındaki Kaydet action metoduna link
verilmiştir).
<a asp-controller=”Ogrenci” asp-action=”Kaydet” class=”orn_
class”>Tıkla</a>
Yerleşik Etiket yardımcı sınıfları (bult-in tag helpers), kullanılmadan önce
@addTagHelper yönergesi ile, doğrudan kullanmak istenen view’de veya tüm
view’lerde kullanılmak üzere _ViewImports.cshtml dosyasında tanımlama
yapılmalıdır. (@addTagHelper*,[Link]) Bu
yapıldıktan sonra, tag helperlara uygun olarak desteklenen bir HTML etiketi
yazıldığında, IntelliSense’te asp-* özelliklerinin görülebilmesi gerekir.

6.2. Tag Helper Avantajları


Aşağıda tag helper’ları kullanmanın avantajları listelenmiştir:

• Tag Helper derleme zamanında kontrol edilir. Model ile bağlanabilir.


Yanlış yazılan ya da değişikliğe uğrayan bir Model olduğunda derleyici
hata verir ve yazılımcıyı bu hatayı düzeltmeye zorlar.
• Html dostu bir geliştirme deneyimi sağlar. Razor Tag Helper kullanan
biçimlendirme standart HTML gibi görünür. Front-End tasarımcılar
HTML/CSS/JavaScript ile, Razor C# söz dizimi öğrenmeksizin düzenleme
yapabilir.

112
WEB PROGRAMLAMA 2

• HTML ve Razor biçimlendirme oluşturmaya yönelik zengin bir IntelliSense


(akıllı kod veya metin tamamlamaya izin veren bir araç) desteği sağlar.
• Yazılan kod, HTML Helper’lara kıyasla daha temiz ve okunabilir hale gelir.
C# kodu ve HTML kodları arasında geçiş yapmak için @ kaçış dizisini
kullanmaya gerek yoktur.
• [Link] Core MVC, view’leri oluşturmamıza yardımcı olacak birçok
yerleşik Tag Helper barındırır. Bunlar ihtiyaçları karşılamıyorsa, kendi
tag helper’larımızı oluşturmamıza olanak sağlar. Ayrıca mevcutlar da
genişletilerek düzenlenebilir haldedir.

[Link] Core tarafından yazılım geliştirmeyi kolaylaştırıp hızlandıran birçok


yerleşik Tag Helper nesnesi tanımlanmıştır. Aşağıda, [Link] Core’da bulunan ve
sık kullanılan tag helper’lar ve bunlar ait özellikler açıklanmıştır.

[Link] Tag Helper (Bağlantı Etiketi Yardımcısı)


Bağlantı etiketi yardımcıları, standart HTML bağlantı etiketini (<a>..</a>)
genişleterek bazı yeni nitelikler sağlar. Standart kurala göre, öz nitelik adı asp- ile
başlamalıdır. Bu yardımcı nesne aşağıdaki öz nitelikleri içerir:

• asp-controller : Bu öz nitelik, URL’yi oluşturmak için kullanılan controller


adını belirler. Böylece yönlendirme belirtilen controller’a gerçekleşmiş
olur. Tanımlı olmazsa view’i oluşturan controller varsayılan olarak atanır.
• asp-action : Bu öz nitelik, action yöntemi adını belirtmek için kullanılır.
Böylece yönlendirme belirtilen action’a gerçekleşmiş olur. Bu öz
nitelik adına herhangi bir değer atanmazsa, view’i oluşturmak için
denetleyicideki varsayılan asp-action değeri yürütülür.
• asp-route: Bu öz nitelik, eylemin URL’sini oluşturmak için kullanılacak
yolun adını belirtmek için kullanılır.

<a asp-controller=”Ogrenci” asp-action=”Kaydet” class=”orn_


class”>Tıkla</a>

6.4. Form Tag Helper (Form Etiket Yardımcısı)


Form Etiket Yardımcısı, MVC Controller eylemi için eylem öz niteliklerine
(asp-controller, asp-action, asp-route vb.) sahip HTML form ögelerini oluşturur.
Aynı zamanda CSRF (Cross Site Request Forgery - Siteler Arası İstek Sahtekârlığı)
şeklinde adlandırılan uygulamaya giden isteklerin hangi kaynaktan ve nasıl
gönderildiği kontrol edilmeyen işlemlerin açıklarından yararlanan saldırılar için
form içinde “Request Verification Token” isimli hidden(gizli) bir değişken de
oluşturur. “asp-route-<parameter name>” öz niteliğini kullanarak post yöntemine
route değeri parametresini de sağlanabilir. Burada, route değerine <pameter
name> eklenir. Aşağıda tag helper ile oluşturulan form ve onun sayfa sağ

113
tıklanıp kaynağı görüntüle dendiğindeki çıktısı yer almaktadır. Form tag helperi
varsayılan olarak post metodunu kullanır. asp-controller ve asp-action kullanarak
Controller ve Action belirtilmediyse, form gönderildiğinde varsayılan olarak,
formu oluşturan Controller ve Action metot çağrılır. Form tag helper elemanlarını
modele özelliklerine bağlamak için view içerisinde model tanıtılmalıdır ( @model
Ogrenci gibi).
<form asp-action=”Kaydet” asp-controller=”Ogrenci”>

</form>
(Yukaradıki form tag helper’ına ait kaynak kod aşağıda yer almaktadır.)
<form action=”/Ogrenci/Kaydet” method=”post”>
<input name=”__RequestVerificationToken” type=”hidden” value=”
CfDJ8BmTpDLY1bNNg970arED8smRThJMZg72qxFd0c30UnfNlGxqJqXd7K
Gr0eoP2TkF4vIwCKmgTsxNnrnQvuNGCTthhzZUZR-p5v2PZ-FCbxk7UyF-
gFMCLCv2jaagOsuzOBnOxMp5VenWarLm-oHHLLQ” />
</form>

Form tag helper’ı ile kullanılabilen özelliklerin listesi aşağıdadır (asp-


controller asp-action ve asp-route yukarıda açıklanmıştır).
• asp-route-{value} : Örneğin {controller}/{action}/{id?} için
<form asp-controller=”Home” asp-action=”Delete” asp-route-id=”10”>
şeklinde bir tanım sağlar.
<form method=”post” action=”/Home/Delete/10”> html çıktısını üretir
• asp-area : URL oluşturulurken kullanılacak alan adını ayarlar.
<form asp-area=”Sirket” asp-controller=”Home” asp-action=”Delete”>
kodu
<form method=”post” action=”/Sirket/Home/Delete”> html çıktısını üretir.
• asp-framgment : Bu özellik, URL’ye eklenmesi istenen URL parçasını
ayarlar. URL parçası, ”#” sonra karakterinden sonra URL’nin sonuna eklenir.
<form asp-controller=”Home” asp-action=”Delete” asp-route-id=”10”
asp-fragment=”test”> şeklinde bir bir kod
<form method=”post” action=”/Home/Delete/10#test”> çıktısını üretir.
• asp-page : Razor Pages ile birlikte kullanılır. Yönlenecek razor sayfası
tanımlanır.
<form asp-page=”/Kayit”> kodu
<form action=”/?page=Kayit” method=”post”> html kodunu üretir.
• asp-host : Oluşturulacak URL’de bir Host tanımlar.
<form asp-host=”[Link]” asp-controller=”Home” asp-action=”Deneme”>
kodu
<form href=”[Link] html kodunu üretir.
• asp-protocol : URL’de kullanılacak protokolü ayarlar

114
WEB PROGRAMLAMA 2

<form asp-protocol=”https” asp-controller=”Home” asp-action=”Delete”>


kodu
<form href=”[Link] html kodunu
üretir.
• asp-antiforgery : Siteler arası istek sahteciliği (CSRF) saldırısını önlemek
için otomatik olarak hidden bir alan üretir. Kullanılmaması durumunda varsayılan
değeri true’dur.
<form asp-controller=”Home” asp-action=”Delete” asp-
antiforgery=”true”>
<form action=”/Home/Delete” method=”post”>
<input name=”__RequestVerificationToken” type=”hidden” value=”
CfDJ8BmTpDLY1bNNg970arED8smRThJMZg72qxFd0c30UnfNlGxqJqXd7K
Gr0eoP2TkF4vIwCKmgTsxNnrnQvuNGCTthhzZUZR-p5v2PZ-FCbxk7UyF-
gFMCLCv2jaagOsuzOBnOxMp5VenWarLm-oHHLLQ” />
</form>

6.5. Input Tag Helper


Input (giriş) ögesi, HTML formlarının omurgasıdır. Genel ve özelleştirilmiş
veri giriş işlemleri için kullanılır. Input tag helper, asp-for öz niteliği kullanılarak
model özelliği için uygun <input> HTML ögesini oluşturur.
asp-for öz niteliği ile model özelliğine bağlanır ve model özelliğinin türü, adı
ve veri açıklamalarına dayalı olarak HTML’yi oluşturur.
Örneğin Ogrenci class’ımızda OgrAd alanı için bir input tag helper kullanalım.
public class Ogrenci
{
public string OgrAd { get; set; }
public string OgrSoyad { get; set; }
public string OgrNo { get; set; }
public int OgrYas { get; set; }
}
<input asp-for=”OgrAd” > şeklinde tanımlanan bir tag helper’da
görebileceğiniz gibi asp-for ile tag helper’ın değerini Ogrenci sınıfının OgrAd
özelliğine ayarlıyoruz. (asp-for=”OgrAd”) Ogrenci sınıfındaki OgrAd özelliğine
ait ismi değiştirsek hata alacağımızı unutmayalım. Oluşturulan koda ait html
çıktısı aşağıdaki gibi olacaktır.
<input type=”text” id=”OgrAd” name=”OgrAd” value=”” />
Bildiğimiz gibi html içinde <input> tipinde birden fazla form elemanı
mevcuttur. Input tag helper, modeldeki veri türene göre Html olarak üretilecek
<input> tipini ayarlar.

115
Tablo 4. Bazı yaygın .NET türlerine karşılık oluşturulan HTML input
özellikleri

.NET type Input Type


Bool type=”checkbox”
String type=”text”
DateTime type=”datetime-local”
Byte type=”number”
Int type=”number”
Single, Double type=”number”

Örneğin bir sınıfa ait aşağıdaki gibi DateTime tipinde DogumTarihi isminde
bir özellik olduğunu düşünelim.
public DateTime DogumTarihi { get; set; }
Bunu input tag helper ile
<input asp-for=”DogumTarihi” /> şeklinde oluşturduğumuzda bu koda ait
html görünümü aşağıdaki gibi olacaktır. (Kodun Html çıktısını görmek için proje
çalıştırılıp, tarayıcı da koda ait çalışan sayfa üzerinde fare ile sağ tıklanarak
“Sayfa Kaynağını Görüntüle” seçilir (Ctrl + U)) Burada input ögesine ait tipin type
özelliğinin type=”datetime-local” olduğuna dikkat edin.
<input class=”form-control” type=”datetime-local” data-val=”true”
data-val-required=”The DogumTarigi field is required.” id=”DogumTarigi”
name=”DogumTarigi” value=”” />

6.6. Label Tag Helper


Çeşitli form elemanlarına ait veri işlemlerinde (<input> , <textarea>)
kullanıcının bu ögeye ait kendinden ne tür bilgi istendiğine dair fikir sahibi
olması gerekmektedir. Bu manuel olarak oluşturulan bir text yazısı olabileceği
gibi dinamik olarak modele bağlı oluşturulan bir text de olabilir. Bu açıklama
niteliğindeki text bilgisi, Label tag helper’ın asp-for öz niteliği ile modele ait
özelliğe bağlı olarak dinamik olarak oluşturulabilir. Böylece aynı modele ait form
işleminin birden fazla yerde kullanılması durumunda modele bağlı tanımlanan
özellik sayesinde yapılan bir değişiklik tüm projede geçerli olur.
Oluşturduğumuz Ogrenci sınıfına ait bir label tag helperi aşağıdaki gibi
kullanılabilir:
<label asp-for=”OgrSoyad” class=”control-label”></label>
<input asp-for=”OgrSoyad” class=”form-control” />

Yukarıdaki kod çalıştırıldığında input etiketinden önce bu input alanına ait


otomatik olarak oluşturulan açıklama Görsel [Link] gösterilmiştir.

116
WEB PROGRAMLAMA 2

Görsel 35. Label Tag Helper Görnümü

Burada dikkat edilirse sınıf özelliği ile aynı adda bir açıklama ifadesi
oluşmuştur. Sınıf özelliğine ait isteğimiz açıklama ifadelerini tanımlamak için İpucu
ileride Data Annotation konusunda ayrıntılı olarak ele alacağımız Display öz Data Annotations ve EF Core’da
Data Annotations Kullanımı konu-
niteliği kullanılmıştır. Böylece sınıfa bir özelliği Label tag helperi ile bağladığımızda suna 9. bölümde yer verilecektir.
görüntülenen metin değeri isteğimiz şekilde oluşturulmuş olur.

public class Ogrenci


{
[Display (Name =”Öğrenci Adı”)]
public string OgrAd { get; set; }
public string OgrSoyad { get; set; }
public string OgrNo { get; set; }
public int OgrYas { get; set; }
}
NOT: Display öz niteliğinin kullanılabilmesi için using System.
[Link]; namespace’i [Link] dosyasının üstünde
tanımlanmalıdır. Herhangi bir namespace’e ait özellik kullanılmak istendiğinde,
ilgili namespace koda eklenmelidir. Bunu yapmanın kolay bir yolu namespace’e
ait tanımlı bir ifade koda eklenir. Fare ile bu ifadenin üzerine gelindiğinde Görsel
[Link] görüldüğü gibi yanında ok işareti olan ufak bir banner görünecektir. Bu
ok’a tıklandığında (eğer yazılan ifade doğru ise) bir menü açılacaktır. using ile
başlayan satıra tıklandığında ilgili namespace otomatik olarak eklenir.

Görsel 36. Namespace ekleme

117
Display özelliği eklendikten sonra proje çalıştırıldığında

Görsel 37. Display özelliği ile kullanılan label tag helper

<label asp-for=”OgrSoyad” class=”control-label”></label>


<input asp-for=”OgrSoyad” class=”form-control” />
Yukarıdaki gibi oluşturulan label ve input tag helper’lara ait html çıktısı
aşağıda verilmiştir:
<label class=”control-label” for=”OgrAd”>Öğrenci Adı</label>
<input class=”form-control” type=”text” id=”OgrAd” name=”OgrAd”
value=”” />

6.7. Textarea Tag Helper


Genel metin girişi işlemleri için, HTML özelliğinde geleneksel olarak <input>
ögesinin text özelliği kullanılır. <Input> ögesinin radio, check gibi özelleştirilmiş
veri girişini sağlayan çeşitleri de vardır. <Input>, kısa ve tek satırlı metin girişleri için
kullanışlı olsa da daha uzun metinler için bu etiket pek uygun değildir. Bunun için
Textarea etiketi mevcuttur. Bu etiket birden fazla satırda metin girişine müsaade
eden ve kaydırma çubukları desteğiyle birlikte daha da çok satıra yayılabilen bir
metin giriş desteği sağlar. Kısaca, uzun metinler için oluşturulmuştur. [Link]
Core’da, Input ögesinde olduğu gibi, Textarea için tag helper mevcuttur.
public string OgrAdres { get; set; }
Öğrenci sınıfının içerisine eklenen yukarıdaki özellik textarea tag helper’ı ile
aşağıdaki şekilde kullanılabilir.
<label asp-for=”OgrAdres” class=”control-label”></label>
<textarea asp-for=”OgrAdres” class=”form-control”></textarea>
Bu koda ait html çıktısı ve kodun görünümü aşağıda verilmiştir.
<label class=”control-label” for=”OgrAdres”>OgrAdres</label>
<textarea class=”form-control” id=”OgrAdres” name=”OgrAdres”></textarea>

Görsel 38. Texarea Tag Helper Görünümü

118
WEB PROGRAMLAMA 2

6.8. Select Tag Helper


HTML Select etiketi, açılır bir liste oluşturmak için kullanılır. Açılır listedeki
her bir eleman <option> ögeleri ile tanımlanır. Select Tag Helper, HTML select
ögesini kullanarak model özelliklerinizi temel alan bir açılır menü oluşturur. asp-
for öz niteliği ile modele ait özelliğe bağlanır.
Açılır listedeki elemanlar bir veri kaynağından dinamik olarak yükleniyorsa
asp-items etiket yardımcı öz niteliği kullanılabilir. Bunun için asp-items öz
niteliği seçim listesinde görünen seçenekleri temsil eden bir SelectListItem veya
SelectList koleksiyonu veya bu iki koleksiyonu döndüren bir ifade olabilir. Ogrenci
sınıfına Sehirler adlı bir özellik eklenmiştir.
public string Sehirler { get; set; }

OgrenciController’ı içindeki Index() action metodunda aşağıda yer alan 4


farklı şehre ait bilgiler oluşturulmuş ve ViewBag’e atanmıştır.
public IActionResult Index()
{
[Link] = new List<SelectListItem>
{
new SelectListItem{ Value = “06”, Text = “Ankara”},
new SelectListItem{ Value = “34”, Text = “İstanbul”},
new SelectListItem{ Value = “35”, Text = “İzmir”},
new SelectListItem{ Value = “54”, Text = “Sakarya”}
};
return View();
}
SeleclistItem kullanımı için ilgili NamaSpace eklenmelidir.

Görsel 39. [Link] Namespace eklenmesi

<label asp-for=”Sehirler” class=”control-label”></label>


<select class=”form-control” asp-for=”Sehirler” asp-items=”ViewBag.
SehirKod”>
</select>

119
Index() action metodunun çağırdığı view içinde yukarıdaki kod yazılırsa
Görsel [Link] gibi bir çıktı elde edilir:

Görsel 40. Select Tag Helper Görünümü

Oluşan Html kodları ise aşağıda verilmiştir:


<label class=”control-label” for=”Sehirler”>Sehirler</label>
<select class=”form-control” id=”Sehirler” name=”Sehirler”>
<option value=”06”>Ankara</option>
<option value=”34”>İstanbul</option>
<option value=”35”>İzmir</option>
<option value=”54”>Sakarya</option>
</select>

6.9. Hazır Razor View Şablonları Oluşturma(Scaffolding


Razor View)
Web Frameworkler, yazılımcının yazması gereken kod miktarını azaltarak
yazılımcıya çeşitli kolaylıklar sağlamaktadır. Bunlardan biri sık tekrarlanan kod
yapılarının tasarım zamanında IDE tarafından otomatik üretilmesidir. Scaffolding,
otomatik olarak kodlar ekleyen ve projemiz için controller ve view’ler oluşturan
bir kod oluşturma çerçevesidir. Veri modeli için oluşturulan controller ve view’ler
geliştiricinin işini kolaylaştırır. CRUD(Oluştur, Oku, Güncelle ve Sil) işlemleri için
kodlar ve sayfalar üretir.
Ogrenci sınıfımız için otomatik olarak bir view üretelim. Bunun için ilgili
OgrenciController’da OgrenciEkle() isimli bir Action metot oluşturalım.
public ViewResult OgrenciEkle()
{
return View();
}
Daha sonra OgrenciEkle() isimli action üzerinde farenin sağ tuşuna basarak
Add View (View Ekle) seçeneğini seçelim (Bölüm 2’de anlatıldığı şekilde de
eklenebilir).

120
WEB PROGRAMLAMA 2

Görsel 41. View Ekleme 1

Buradan Razor View seçeneği seçilir.

Görsel 42. View Ekleme 2

Daha sonra gelen ekranda View Name ile view’in adı. Temlate ile oluşturulacak
şablon seçimi, Model Class seçeneği ile de hangi modelin oluşturulacak view’e
bağlanacağı seçilir. Bu seçimler tamamladığında Create şablonu otomatik olarak
oluşturulacaktır.
Template kısmında Empty, Create, Edit, Delete, Details ve List şeklinde
hazır şablonlar yer almaktadır. Bunların işlevselliği hakkında kısa bilgi aşağıda
verilmiştir:

121
Şekil 8. Template kısmındaki Empty, Create, Edit, Delete, Details ve List
hazır şablonları

Görsel 43. View Ekleme 3

122
WEB PROGRAMLAMA 2

Tüm bu işlemler sonucunda aşağıdaki kod otomatik olarak üretilecektir. Kod


incelendiğinde Ogrenci modeli ile ilişkilendirilen bu view içerisinde Tag helper’lar
kullanılarak ogrenci nesnesi oluşturmaya uygun bir form otomatik olarak
yapılandırılmıştır. İstendiği takdirde tag helper’lar ile otomatik oluşturulan form
elemanları değiştirilip düzenlenebilir.
@model [Link]

@{
ViewData[“Title”] = “OgrenciEkle”;
}

<h1>OgrenciEkle</h1>

<h4>Ogrenci</h4>
<hr />
<div class=”row”>
<div class=”col-md-4”>
<form asp-action=”OgrenciEkle”>
<div asp-validation-summary=”ModelOnly” class=”text-danger”></
div>
<div class=”form-group”>
<label asp-for=”OgrAd” class=”control-label”></label>
<input asp-for=”OgrAd” class=”form-control” />
<span asp-validation-for=”OgrAd” class=”text-danger”></span>
</div>
<div class=”form-group”>
<label asp-for=”OgrSoyad” class=”control-label”></label>
<input asp-for=”OgrSoyad” class=”form-control” />
<span asp-validation-for=”OgrSoyad” class=”text-danger”></span>
</div>
<div class=”form-group”>
<label asp-for=”OgrNo” class=”control-label”></label>
<input asp-for=”OgrNo” class=”form-control” />
<span asp-validation-for=”OgrNo” class=”text-danger”></span>
</div>
<div class=”form-group”>
<label asp-for=”OgrYas” class=”control-label”></label>
<input asp-for=”OgrYas” class=”form-control” />
<span asp-validation-for=”OgrYas” class=”text-danger”></span>
</div>
<div class=”form-group”>
<label asp-for=”DogumTarigi” class=”control-label”></label>

123
<input asp-for=”DogumTarigi” class=”form-control” />
<span asp-validation-for=”DogumTarigi” class=”text-danger”></
span>
</div>
<div class=”form-group”>
<label asp-for=”OgrAdres” class=”control-label”></label>
<input asp-for=”OgrAdres” class=”form-control” />
<span asp-validation-for=”OgrAdres” class=”text-danger”></span>
</div>
<div class=”form-group”>
<label asp-for=”Sehirler” class=”control-label”></label>
<input asp-for=”Sehirler” class=”form-control” />
<span asp-validation-for=”Sehirler” class=”text-danger”></span>
</div>
<div class=”form-group”>
<input type=”submit” value=”Create” class=”btn btn-primary” />
</div>
</form>
</div>
</div>

<div>
<a asp-action=”Index”>Back to List</a>
</div>

@section Scripts {
@{await [Link](“_ValidationScriptsPartial”);}
}

124
WEB PROGRAMLAMA 2

Bu Bölümde Ne Öğrendik?

* Tag helper’ler HTML’de yazılan kodlama miktarını azaltmaktadır.

* Tag Helper derleme zamanında kontrol edilir ve model ile bağlanabilir. Bu durumda değişikliğe
uğrayan bir Model olduğunda derleyici hata verir ve yazılımcının bu hatayı düzeltmesi istenir.

* Tag Helper’lar HTML ve Razor biçimlendirme oluşturmaya yönelik zengin bir IntelliSense desteği
sağlamaktadır.

* Tag helper’ların derleme zamanında kontrol, model ile bağlanabilme, html görünümü ile kolay
uyum, zengin bir IntelliSense desteği ve @ kaçış dizisini kullanmaya gerek olmadan kod yazma
gibi avantajları bulunmaktadır.

* [Link] Core’da yerleşik olarak bulunan ve sık kullanılan tag helper’lar Anchor, Form, Input, Label,
Textarea ve Select Tag Helper’ları olarak sayılabilir.

* Web Frameworkler, yazılımcının yazması gereken kod miktarını azaltarak yazılımcıya çeşitli
kolaylıklar sağlamaktadır. Scaffolding, otomatik olarak kodlar ekleyen ve projemiz için controller
ve view’ler oluşturan bir kod oluşturma çerçevesidir.

125
Kaynakça
[Link] [Link]
views/tag-helpers/intro?view=aspnetcore-5.0 views/working-with-forms?view=aspnetcore-5.0

[Link] [Link] Core in Action, Andrew Lock Second Edition Man-


core-tag-helpers ning Publications, 2021

[Link] [Link]
and-other-common-tag-helper-in-asp-net-core-mvc/ [Link]

126
WEB PROGRAMLAMA 2

Bölüm Soruları
1) <form asp-controller=”Ogrenci” asp-action=”Ekle” asp-route-id=”5”>..</
form> şeklinde tanımlanan bir form tag helper için çıktı üretilen Html
çıktısı ne olur?
a) <form method=”post” action=”/Ogrenci/ekle/5”>..</form>
b) <form method=”get” action=”/Ekle/Ogrenci/5”>..</form>
c) <form method=”post” action=”/5/Ogrenci/Ekle”..></form>
d) <form method=”get” action=”/Ogrenci/ekle/5”>..</form>
e) <form method=”post” action=”self”>..</form>

2) Yerleşik tag helper’ların tüm view’lerde kullanılması için @addTagHelper


yönergesi ile yapılan tanımlama hangi dosyada yer almalıdır?
a) _Layout.cshtml
b) [Link]
c) [Link]
d) _ViewImports.cshtml
e) [Link]

3) Modelde veri türü bool olarak ayarlanan bir özellik tag helperlar ile bu
model özelliğine bağlandığında Html olarak üretilecek <input> elemanın
tipi ne olur?
a) type=”text”
b) type=”checkbox”
c) type=”number”
d) type=”datetime-local”
e) type=”null”

4) Input tag helper, …. öz niteliği kullanılarak model özelliği için uygun


<input> HTML ögesini oluşturur, ifadesinde …. ile belirtilen yere hangi
ifade gelmelidir?
a) type
b) text
c) asp-for
d) form
e) for

5) Belirtilen model sınıfını oluşturmak için form ögelerini içeren bir Razor
View oluşturmak istediğimizde hangi template seçilmelidir?
a) Empty
b) Create
c) Edit
d) Delete
e) Details
127
I. Tag Helper derleme zamanında kontrol edilir.
II. Model ile bağlanabilir.
III. Zengin bir IntelliSense desteği sağlar.

6) Tag Helper’lar ile ilgili yukarıdakilerden hangisi/hangileri söylenebilir?


a) Yalnız I
b) Yalnız II
c) I ve II
d) II ve III
e) I,II ve III

7) Aşağıdakilerden hangisi ile Tıkla linkine tıklandığında Personel


controller’ındaki Getir action metoduna link verilmiş olur?
a) <a asp-controller=”Personel” asp-action=”Getir”>Tıkla</a>
b) <a controller=”Personel” action=”Getir”> Tıkla</a>
c) <a asp-controller=”Getir” asp-action=”Personel”>Tıkla</a>
d) <a asp-for=”Personel” asp-action=”Getir”>Tıkla</a>s
e) <a asp-cont=”Personel” asp-act=”Getir”>Tıkla</a>

8) Modelde veri türü int olarak ayarlanan bir özellik tag helperlar ile bu
model özelliğine bağlandığında Html olarak üretilecek <input> elemanın
tipi ne olur?
a) type=”text”
b) type=”checkbox”
c) type=”number”
d) type=”datetime-local”
e) type=”null”

public int Numara { get; set; }


9) Yukarıdaki şekilde tanımlı bir model elemanının tag helper ile kullanımı
nasıl olmalıdır?
a) <input asp-label=”Numara” />
b) <input asp-tag=”Numara” />
c) <input asp-helper=”Numara” />
d) <input asp-for=”Numara” />
e) <input asp-texfor=”Numara” />

128
WEB PROGRAMLAMA 2

10) Label tag helper’ı ile modele ait bir özelliğin text ifadesi değiştirilmek
istendiğinde hangi öz nitelik kullanılmalıdır?
a) [Display]
b) [Show]
c) [ShowMessage]
d) [DisplayTag]
e) [DisplapLabel]

Cevaplar
1-a 2-d 3-b 4-c 5-b 6-e 7-a 8-c 9-d 10-a

129
130
7. MODEL DOĞRULAMA (MODEL VALIDATION)
Uygulamaya koymadıkça, bilgi değersizdir.
Anton Çehov

Ders videosunu izlemek için


QR kodu taratın.

Kazanımlar Birlikte Düşünelim


• Veri doğrulama işlemini tanımlayabilir ve bu işlemin önemini
kavrayabilir. 1. Web uygulamalarında veri doğ-
• İstemci ve sunucu taraflı model doğrulama yapısını bilebilir ve rulama nedir ve neden önemli-
kullanabilir. dir?
• Asp Net Core MVC uygulamalarında modellerini model
doğrulama işlemine uygun olarak tanımlayabilir. 2. Model doğrulama nedir ve nasıl
• Asp Net Core MVC uygulamalarında model doğrulama sürecini kullanılır?
istemci ve sunucu taraflı olarak gerçekleştirebilir.
3. Model doğrulamada kullanılan
Başlamadan Önce öz nitelikler nelerdir?
Önceki bölümde etiket yardımcıları (tag helper) ele alınmıştı.
Bu bölümde ise model doğrulama (model validation) konusu ele 4. İstemci ve sunucu taraflı model
alınacaktır. Günümüz dünyasında verilerin doğru bir şekilde ve istenen doğrulama nasıl gerçekleştirilir?
formatta elde edilmesi son derece önemlidir. Bu durum aynı zamanda
uygulamaların hatasız ve kesintisiz bir şekilde sürdürülmesini sağlar.
Elde edilen verilerin depolanması; ticari, eğitim, sağlık, iletişim vb. gibi
alanlarda makine öğrenmesi, derin öğrenme vb. modern çözümler sunan
algoritmalarla kullanılmasını da beraberinde getirir.
131
7.1. Giriş
Kullanıcılar ile interaktif bir şekilde bir veri paylaşımı gerçekleştirdiğinizde,
gelen değerlerin beklenen veri türünde, izin verilen aralıkta ve gerekli olan tüm
verilerin mevcut olduğundan emin olunması gereklidir. Bu işlem veri doğrulama
olarak bilinir.
“Kullanıcı girişi” terimi, kullanıcının üzerinde kontrol sahibi olduğu
herhangi bir değeri kapsar. Formlar aracılığıyla sağlanan değerler, kullanıcı
girişinin büyük bir kısmını oluşturur. Kullanıcıdan alınan veriler çoğunlukla
veri tabanlarında kayıt altına alındığından, verinin veri tabanında tanımlandığı
doğrultuda kaydedilmesi önem arz etmekte, aksi durumda istenmeyen sonuçlar
oluşabilmektedir. Bu noktada bilinçli bir şekilde web projelerinde hata ve açık
arayan kullanıcılar olabileceği gibi, veri girişi sırasında yaptığı yanlış işlem
sonucunda sisteme zarar verebilecek kullanıcılar da mevcuttur. Bu durumlar
için genel yaklaşım, tüm kullanıcı girdilerinin güvenilmez olarak kabul edilmesi
yönündedir. Bu yüzden veri, işlenmeden önce kontrol edilip, doğrulanmalıdır.
Kontrol sürecinin ilk kısmı verilerin kontrol edilerek, istenen kısıtlamalar
dâhilinde olup olmadığıdır. Bu işlem verinin bütünlüğünü korumanın en önemli
yollarından biridir. İkinci kısım ise verinin hatalı olması durumunda gerekli geri
bildirimler ile kullanıcının sorunu algılamasını sağlamak ve sorunu düzeltmesine
yardımcı olmaktır.
Veri girişi yapıldığında, verilerin uygulama tarafından belirlenen kısıtlamalar
dâhilinde olup olmadığı tarayıcı ve/veya web sunucusunda kontrol edilmelidir.
Tarayıcıda yapılan doğrulamaya istemci taraflı doğrulama (client-side validation),
sunucuda yapılan doğrulamaya ise sunucu taraflı doğrulama (server-side
validation) denmektedir. Sunucu taraflı doğrulama işlemleri, sunucu tarafında
kullanılan bir programlama dili ile istemci tarafından gelen veriler üzerinde
gerçekleşirken, istemci taraflı doğrulama ise javascript (js tabanlı frameworkler de
dâhil) ve/veya Html5 form doğrulama özellikleri ile istemcinin tarayıcısında daha
veriler sunucuya gönderilmeden gerçekleşir. İstemci tarafı doğrulama ile kullanıcı
dostu geri bildirimler kullanılarak sunucuya gönderilen veri akışı azaltılmış olur.
Ancak, istemci doğrulamaları çeşitli yöntemlerle (tarayıcıda javascrit’i disable
etme vb.) ekarte edilebileceğinden tek başına yeterli değildir. Sunucu tarafında
doğrulama yapmak da gereklidir. Genel yaklaşım doğrulamanın hem istemci hem
sunucu tarafında da gerçekleştirilmesidir.
Doğrulama işleminin istemci tarafında Html5’in sunduğu form doğrulama
özellikleri ya da javascript (js, js frameworkleri vb.) ile gerçekleşebileceğinden
bahsetmiştik. İstemci taraflı doğrulamayı bu şekilde gerçekleştirip form üzerinden
gelen POST ya da GET verilerinin istenen formatta ve yapıda olup olmadığının
kontrolü sunucu tarafında programcı tarafından kendi yazdığı kodlarla kontrol
edilebilir. Bu kısımda bu kontrol mekanizmasından bahsetmekten ziyade [Link]
Core’un sunduğu model doğrulama üzerinde durulacaktır.

132
WEB PROGRAMLAMA 2

Server-Side Validation

HTML form
Controller
Results Client-Side Results Code, etc
Validation

javaScript

Client-Side Server-Side

Çizim 6. [Link] Core da gerçekeleşen istemci ve sunucu taraflı


doğrulama ([Link]
core-3-1/)

7.2. Model Doğrulama (Model Validation)


Model doğrulama, uygulama tarafından alınan verilerin modele bağlanmaya
uygun olmasını sağlama sürecidir. [Link] Core uygulamalarında model
bağlama ile HTTP isteklerinden gelen veriler action metoda ait parametreler ile
otomatik olarak eşlenir ve model bağlama işleminin ardından model doğrulama
gerçekleştirilir. Bu işlem ile kullanıcıdan alınan ve model bağlama ile bağlanan
verilerin modele ait özelliklere uyup uymadığı kontrol edilir. Uymadığı durumlarda
hata mekanizması ile kullanıcının uyarılması sağlanır.
Model doğrulama; view’lerde kullanılan tag helper’ların model verilerine
uygun bir şekilde bağlanması ile istemci tarafında, controller içinde ilgili action
da gerçekleştirilen kontroller ile de sunucu tarafından gerçekleştirilebilir.
Doğrulama öz nitelikleri, model özellikleri için doğrulama kuralları
belirlemenizi sağlar. Bunun için [Link];
namespace’i modelin tanımlandığı dosyaya eklenmelidir. Bir öz nitelik sınıfa ait
hangi özelliğe tanımlanacaksa o özelliğin hemen önünde yer almalıdır ve sadece
o özelliğe ait olarak tanımlanmış olur. Aşağıda doğrulama için kullanılan öz
nitelikler ve açıklamaları yer almaktadır.

133
Şekil 9. Doğrulama İçin Kullanılan Öz nitelikler ve Kullanımına Örnek

[Link] Core MVC framework’ü kullanıcılara ihtiyaçları çerçevesinde kendi


doğrulama öz niteliklerini oluşturmaya da imkân verir.

public class Kullanici


{
[Required(ErrorMessage =”Kullanıcı Adı Alanı Zorunludur”)]
[StringLength(50)]
public string KullaniciAdi { get; set; }

[Required]
[EmailAddress(ErrorMessage =”Geçerli bir mail adres giriniz”)]
public string Email { get; set; }
}
134
WEB PROGRAMLAMA 2

Yukarıda Kullanici adlı sınıfta doğrulama için kullanılan öz niteliklerden


bir kısmının nasıl kullanıldığı gösterilmiştir. Örneğin KullaniciAdi
özelliğinin [StringLength(50)] ile 50 karakter ile sınırlandırılacağı belirtilmiş,
[Required(ErrorMessage =” Kullanıcı Adı Alanı Zorunludur”)] öz niteliği ile de bu
alanın zorunlu bir alan olduğu, modelin form ile bağlandığı durumunda bu alan
boş bırakılıp form gönderilmek istendiğinde gösterilecek hata mesajının ne olacağı
belirtilmiştir. Email özelliği [Required] ile zorunlu bir alan olarak tanımlanmış
ve [EmailAddress(ErrorMessage =”Geçerli bir mail adres giriniz”)] ile mail adres
formatına uygunluğunun kontrolü gerçekleştirilmiştir. Form ekranında Email
özelliğine bağlanan alana hatalı bir mail adresi girildiğinde kullanıcıya Geçerli
bir mail adres giriniz hata mesajı gösterilecektir.

7.2.1. Model Doğrulama Kullanımı


Model doğrulama hem istemci hem sunucu taraflı olarak gerçekleştirilebilir.
İstemci taraflı model doğrulama tag helper’lar yardımı ile JQuery ile gerçekleşirken,
sunucu taraflı doğrulama modelin bağlandığı form sunucuya gönderildiğinde
sunucu tarafında gelen verilerin kontrolü ile olur.

7.2.2. İstemci Taraflı Model Doğrulama


[Link] Core, istemci tarafı doğrulama kodu eklemeyi kolaylaştıran,
doğrulama kütüphanesi içerir. Bunun için istemci tarafı doğrulama kütüphaneleri
(JQuery, [Link] & [Link]) belirtilen sırada projeye
dahil edilmelidir. Bu komut dosyalarının tüm viewler tarafından kullanılabilir
olmaları için Layout dosyasında (_Layout.cshtml) ekli olmaları yeterlidir. Tercih
edilen yaklaşım doğrulama kütüphanesinin kullanıldığı view’lere ekleme
şeklindedir.
NOT: [Link] Core MVC projelerinde Jquery kütüphanesi shared klasörü
altında yer alan “_Layout.cshtml” dosyasında aşağıdaki gibi eklidir.
<script src=”~/lib/jquery/dist/[Link]”></script>
JQuery,[Link] & [Link] yine shared klasörü
altındaki _ValidationScriptsPartial.cshtml dosyası içinde aşağıdaki gibi
eklenmiştir. Bu doğrulama komut dosyaları herhangi bir view’de kullanılabilmeleri
için ilgili view’e eklenmelidir.
<script src=”~/lib/jquery-validation/dist/[Link]”></script>
<script src=”~/lib/jquery-validation unobtrusive/[Link].
[Link]”></script>

Modelleriniz için veri doğrulama öz niteliklerini kullandığımızda tag


helper’lar yardımı ile form, formlara ait ögeler ve bu ögeler için doğrulama
verileri otomatik olarak oluşturulabilir. Doğrulama mesajı tag helper’ı,
genellikle herhangi bir doğrulama mesajını görüntülemek için aynı özellik için
bir giriş etiketi yardımcısından sonra kullanılır. Modelimizin için hata mesajının

135
görüntülenebileceği tag helper (<span> vb.) asp-validation-for öz niteliği ile
modele bağlanır.
<label asp-for=”KullaniciAdi” class=”control-label”></label>
<input asp-for=”KullaniciAdi” class=”form-control” />
<span asp-validation-for=”KullaniciAdi” class=”text-danger”></span>
Yukarıdaki kod’da ile Kullanici sınıfında KullaniciAdi adlı özelliğe ait model
doğrulama işleminde oluşacak hatalar <span> tag helper’ında gösterilecektir.
Örneğin aşağıdaki gibi tanımlı bir sınıf için otomatik olarak bir Create view ‘i
oluşturulduğunda tag helper’lar ile aşağıdakine benzer bir kod oluşacaktır.
public class Kullanici
{
[Display (Name =”Kullanici Adı”)]
[Required(ErrorMessage = “Kullanıcı Adı Alanı Zorunludur”)]
[StringLength(50)]
public string KullaniciAdi { get; set; }

[Display(Name = “Kullanici Mail”)]


[Required (ErrorMessage =”Mail adresini boş bırakmayınız”)]
[EmailAddress(ErrorMessage = “Geçerli bir mail adres giriniz”)]
public string Email { get; set; }
}
Örneğin yukarıdaki gibi tanımlı bir Kullanici sınıfı için otomatik olarak bir
Create template view‘i oluşturulduğunda tag helper’lar ile oluşan kod aşağıdakine
benzer bir yapıda olacaktır.
@model [Link]

@{
ViewData[“Title”] = “Kullanici Ekle”;
}

<h1>Kullanici Ekle</h1>

<hr />
<div class=”row”>
<div class=”col-md-4”>
<form asp-action=”KullaniciEkle”>
<div asp-validation-summary=”ModelOnly” class=”text-danger”></
div>
<div class=”form-group”>
<label asp-for=”KullaniciAdi” class=”control-label”></label>
<input asp-for=”KullaniciAdi” class=”form-control” />

136
WEB PROGRAMLAMA 2

<span asp-validation-for=”KullaniciAdi” class=”text-danger”></


span>
</div>
<div class=”form-group”>
<label asp-for=”Email” class=”control-label”></label>
<input asp-for=”Email” class=”form-control” />
<span asp-validation-for=”Email” class=”text-danger”></span>
</div>
<div class=”form-group”>
<input type=”submit” value=”Oluştur” class=”btn btn-primary” />
</div>
</form>
</div>
</div>

<div>
<a asp-action=”Index”>Back to List</a>
</div>

@section Scripts {
@{await [Link](“_ValidationScriptsPartial”);}
}
NOT: [Link] ile _ValidationScriptsPartial.cshtml dosyası
partial view (bir view’in başka bir view içerisinde kullanılması) olarak eklenmiştir.
Dikkat edilirse Kullanici sınıfının her bir özelliğine ait bir <span> etiketi
tanımlanarak bu etiket asp-validation-for ile ilgili model özelliğine bağlanmıştır.
Model sınıfına uygun veri formatına uyulmadan form gönderildiğinde oluşan hata
mesajları Görsel [Link] gösterilmiştir.

137
Görsel 44. Kullanıcı taraflı hata mesajları

7.2.3. Sunucu Taraflı Model Doğrulama


İstemci tarafı doğrulaması, istenen formatta verilerin alınmasında tek
başına yeterli değildir. İstemci taraflı doğrulama kullanıcı bilgisayarında
gerçekleştirildiğinden çeşitli müdahalelerle etkisiz hale getirilebilir. Örneğin
Postman, Curl gibi araçlarla form verileri doğrudan gönderilebilir, kullanıcı
tarayıcının geliştirici araçlarını kullanarak javascrit’i devre dışı bırakabilir ya
da forma ait verileri tarayıcıdan sayfa kaynağını görüntüle diyerek alabilir ve
doğrulama konutlarını kaldırarak aynı formu kullanabilir.
Bu noktada istemci tarafı doğrulamasını atlatmak kolay olduğundan, sunucu
tarafı doğrulaması [Link] Core doğrulama çerçevesinin bir parçası olarak yer
almaktadır.
Model bağlama ile form elemanlarına bağlanan model gönderildiğinde,
model bağlayıcı, model bağlama ve doğrulamanın sonucuyla ModelState
nesnesini günceller. ModelState, model bağlama ve model doğrulama olarak
adlandırılan iki alt sistemden gelen hataları temsil eder ve modele gönderilen
değerlerin ayrıntılarını, modelin her özelliği için meydana gelen doğrulama
hatalarıyla birlikte izler. Doğrulama başarısız olursa model bağlayıcı herhangi bir
hata oluşturmaz. Ancak ModelState nesnesini hatalar listesiyle birlikte günceller
ve bir action metot çağırmadan önce isValid özelliğini false olarak ayarlar.
if ([Link])
{
//Model geçerli. İstenen işlem gerçekleştirilebilir

138
WEB PROGRAMLAMA 2

}
else
{
//Doğrulama başarısız. Kullanıcıya hata Mesajı verdirilmeli
}

7.3. Örnek Uygulama


“FormDogrulama” isimli yeni bir Asp Core MVC Web projesi oluşturduk. Bu
uygulamada öğrencilerin Ad Soyad, Cinsiyet, Sınıf, Mail gibi bilgilerini, istenen
veri özellikleri çerçevesinde almayı; girilen verilerin istemci ve sunucu taraflı
model doğrulamasını yaparak gerçekleştireceğiz.
Bu projeye Ogrenci adlı bir sınıf ekliyoruz (Model klasöründe sağ tıklayarak
Add >> Class seçeneğinden).

Görsel 45. Ogrenci sınınıfın eklenmesi

[Link] dosyamızın içeriğini sınıf özellikleri ile birlikte aşağıdaki gibi


yazıyoruz:
using System;
using [Link];
using [Link];
using [Link];
using [Link];

namespace [Link]
{
public class Ogrenci
{

139
[Required(ErrorMessage =”İsim alanı boş bırakılmamalıdır”)]
[Display(Name = “Ad Soyad”)]
public string AdSoyad { get; set; }

[Required(ErrorMessage = “Cinsiyet seçilmelidir”)]


public string Cinsiyet { get; set; }

[Range(1, 6,ErrorMessage =”Seçilen Sınıf 1-6 arasında olmalıdır”)]


public int Sinif { get; set; }

[RegularExpression(“^[a-zA-Z0-9_\\.-]+@([a-zA-Z0-9-]+\\.)+[a-zA-Z]
{2,6}$”, ErrorMessage = “Geçerli bir mail adresi giriniz”)]
public string Email { get; set; }

}
}

Öğrenci işlemlerini gerçekleştireceğimiz OgrenciController’ını Controller


klasörüne sağ tıklayarak Add >> Controller seçeneği ile (MVC controller- Emtpy
seçeneği ile boş bir contoller seçerek) ekliyoruz.

Görsel 46. OgrenciController’ının eklenmesi

Eklenen OgrenciController’ına Ekle isminde bir action metot tanımlayalım.


public class OgrenciController : Controller
{
public IActionResult Index()

140
WEB PROGRAMLAMA 2

{
return View();
}
public IActionResult Ekle()
{
return View();
}
}

Ekle action “metodu”na sağ tıklayarak modelimize bağlayacağımız view’i


ekliyoruz.

Görsel 47. View eklenmesi

Görsel 48. Razor seçimi

Sonraki sayfada template olarak “Create”, model class alanında


oluşturduğumuz Ogrenci sınıfını seçip view’imizi oluşturuyoruz.

141
Görsel 49. Template ve Model class seçimi

View içinde ogrenci nesnesi oluşturmaya yönelik form, Ogrenci sınıfımıza ait
özelliklerin tag helper’lar ile bağlanması ile oluşturulmuştur. Bu sayfada standart
olarak oluşan Cinsiyet ve Sınıf tag helper’larının tiplerini veri girişine daha uygun
olması açısından değiştiriyoruz. (Sınıf özelliği için <select>, Cinsiyet özelliği için
tipi radio kullanıldı) [Link] dosyasının son hali aşağıdadır:
@model [Link]

@{
ViewData[“Title”] = “Index”;
}

<h1>Öğrenci Ekleme</h1>

<hr />
<div class=”row”>
<div class=”col-md-4”>
<form asp-action=”Kaydet”>
<div asp-validation-summary=”ModelOnly” class=”text-danger”></
div>
<div class=”form-group”>
<label asp-for=”AdSoyad” class=”control-label”></label>
<input asp-for=”AdSoyad” class=”form-control” />
<span asp-validation-for=”AdSoyad” class=”text-danger”></span>
</div>

<div class=”form-group”>

142
WEB PROGRAMLAMA 2

<label asp-for=”Cinsiyet” class=”control-label”></label>


<div>
<input asp-for=”Cinsiyet” type=”radio” value=”bay” />Bay
<input asp-for=”Cinsiyet” type=”radio” value=”bayan” />Bayan
</div>
<span asp-validation-for=”Cinsiyet” class=”text-danger”></span>
</div>
<div class=”form-group”>
<label asp-for=”Sinif” class=”control-label”></label>
<select asp-for=”Sinif” class=”form-control”>
<option value=”Select”>Sınıf Seçiniz</option>s
<option value=”1”>1.Sınıf</option>
<option value=”2”>2.Sınıf</option>
<option value=”3”>3.Sınıf</option>
<option value=”4”>4.Sınıf</option>
<option value=”5”>5.Sınıf</option>
<option value=”6”>6.Sınıf</option>
</select>
<span asp-validation-for=”Sinif” class=”text-danger”></span>
</div>
<div class=”form-group”>
<label asp-for=”Email” class=”control-label”></label>
<input asp-for=”Email” class=”form-control” />
<span asp-validation-for=”Email” class=”text-danger”></span>
</div>
<div class=”form-group”>
<input type=”submit” value=”Ekle” class=”btn btn-primary” />
</div>
</form>
</div>
</div>

<div>
<a asp-action=”Listele”>Tüm Listeyi Gör</a>
</div>

@section Scripts {
@{await [Link](“_ValidationScriptsPartial”);}
}

Burada kullanıcı taraflı veri doğrulama işlemini sınıfa ait her bir özelliği asp-
validation-for öz niteliği ile bağlayarak halletmiş olduk.

143
Yukarıdaki tanımlı form post edildiğinde verilerin karşılanacağı ve sunucu
tarafında doğrulama işleminin yapılacağı OgrenciContoller altında Kaydet action
metodunu oluşturup kodunu yazalım.
public class OgrenciController : Controller
{
static List<Ogrenci> Ogrenciler = new List<Ogrenci>();

public IActionResult Index()


{
return View();
}
public IActionResult Ekle()
{
return View();
}

[HttpPost]
public IActionResult Kaydet(Ogrenci ogr)
{
if ([Link])
{
[Link](ogr);
return View(ogr);
}
else
{

return View(“Hata”);
}
}
}
OgrenciController’da static List<Ogrenci> Ogrenciler = new List<Ogrenci>();
şeklinde static olarak Ogrenci tipinde elemanlardan oluşan Ogrenciler liste
değişkeni tanımlanmıştır. Burada static olarak tanımlanmayıp normal bir liste
olarak tanımlansaydı, bu değişken için her bir istek sonrasında oluşan yeni
uygulama örneği ile içerisindeki verileri kaybedecekti. Static değişkenler ise bir
kez oluşturulurlar. Static olarak tanım yapılarak bir sonraki istekte de içeriğinin
değişmemesi sağlanmış olur (bir sonraki istek belirli bir süre bekledikten sonra
gerçekleşirse içerik sıfırlanır).
Yukarıda Kaydet isimli action metot, formdan gelen Ogrenci tipinde ogr
nesnesini parametre olarak almıştır. Model bağlama ile gelen ogr nesnesine ait

144
WEB PROGRAMLAMA 2

alanlar if([Link]) kontrolu ile sunucu taraflı doğrulama işlemine tabi


tutulmuştur. Bu işlem true ise, yani doğrulamadan geçti ise gelen nesne Ogrenciler
listesine [Link](ogr); kodu ile eklenmiştir. return View(ogr); ile de Kaydet
view’ine ogr nesnesi gönderilmiştir. Burada Kaydet view’inde yapılmak istenen,
eklenen tüm öğrencilere ait verileri kullanıcıya göstermektir. Model doğrulama
başarısız ise else bloğunda return View(“Hata”); kodu ile Hata isimli view geri
döndürülmüştür.
Şimdi Kaydet ve Hata viewlerini oluşturalım. Kaydet view’i için Kaydet action
metodu üzerine sağ tıklayarak Add View seçeneğini seçelim. Daha sonra Razor
View seçerek

Görsel 50. [Link] dosyası oluşturma

Template kısmında Details, Model class kısmında oluşturduğumuz Ogrenci


modelini seçerek view’imizi oluşturalım.

Görsel 51. [Link] için model ve template seçimi

[Link] dosyası oluştuğunda aşağıdakine benzer yapıda oluşacaktır.


Burada Html Helper’lar ile kod otomatik olarak oluşturulmuştur. DisplayNameFor
html helper ile parantez içinde lambda ifadesi ile belirtilen özelliğin adını ( varsa

145
özelliğin display öz niteliğinde kullanılan adı) gösterir. Burada DisplayFor ise
model ögelerini gösterir.
@[Link](model => [Link]) ile ekrana è Ad Soyad
@[Link](model => [Link]) ile ekrana è ogr nesnesi ile
modele bağlanan Ad Soyad içeriği basılacaktır. (Örneğin Hasan Tan)

@model [Link]
<div>
<h4> Kaydedilen Öğrenci Bilgisi </h4>
<hr />
<dl class=”row”>
<dt class = “col-sm-2”>
@[Link](model => [Link])
</dt>
<dd class = “col-sm-10”>
@[Link](model => [Link])
</dd>
<dt class = “col-sm-2”>
@[Link](model => [Link])
</dt>
<dd class = “col-sm-10”>
@[Link](model => [Link])
</dd>
<dt class = “col-sm-2”>
@[Link](model => [Link])
</dt>
<dd class = “col-sm-10”>
@[Link](model => [Link])
</dd>
<dt class = “col-sm-2”>
@[Link](model => [Link])
</dt>
<dd class = “col-sm-10”>
@[Link](model => [Link])
</dd>

</dl>
</div>
<div>
<a asp-action=”Ekle”>Yeni yıt için Tıklayınız</a>
</div>

146
WEB PROGRAMLAMA 2

Yukarıdaki kod bloğu istendiği takdirde aynı verileri gösterecek şekilde html
elemanları ya da tag helper’lar ile de organize edilebilir.
[Link] view’ini de boş bir razor view (razor page ve razor view farklı
kavramlardır) seçilerek oluşturalım. Burada bu sayfa kullanıcı taraflı veri
doğrulama işlemleri bir şekilde atlatıldığında sunucu tarafında yakalanan bu
durum için kullanıcıya hata mesajı görüntülemek için tasarlanmıştır. Bu view’in
içeriğini basitçe aşağıdaki gibi tek satır kod ile tamamlayalım:
<h1>Hata</h1>
Boş bir razor view olarak oluşturduğumuz [Link] view’inin içeriği
aşağıdaki şekilde tanımlayalım:
<div align=”center”>
Öğrenci Ekleme ve Listeleme projesine hoşgeldiniz.
Yukarıdaki Menüleri kullanarak işlem yapabilirsiniz
</div>
Son olarak Ogrenciler isimli listemize eklenen kayıtları gösterelim. Bunun için
OgrenciController’ı altında Listele isimli bir action metot oluşturalım.
public IActionResult Listele()
{
return View(Ogrenciler);
}
Görüldüğü gibi listele isimli view’e Ogrenci neslerini tutan Ogrenciler listesi
parametre olarak gönderilmiştir. Bu noktada Listele isimli view Görsel [Link] gibi
oluşturulabilir. Model class seçeneğinde Ogrenci modelimizi, Template kısmında
ise List seçeneğini seçtiğimiz view’i oluşturalım.

Görsel 52. [Link] için model ve template seçimi

147
[Link] view’i gönderilen Ogrenciler listesinde yer alan kayıtları tablo
olarak gösterecek şekilde oluşturulacaktır. Ancak bu listede hiç kayıt yoksa
oluşturulan kodda hata meydana gelir. Bunun için Ogrenciler listesinde eleman
olup olmadığını kontrol eden kod @if ([Link]() > 0) şeklinde bir kontrolle
gerçekleştirilmiştir. Listede eleman varsa bu elemanlar tablo yapısı oluşturularak
ekrana basılmış, eleman yoksa da if ’e ait else bloğu işletilerek kullanıcıya “
Herhangi bir öğrenci Kaydı yok” mesajı verilmiştir. Bu noktada güncellenen
[Link] view’ine ait kodlar aşağıdadır.

@model IEnumerable<[Link]>

@{
ViewData[“Title”] = “Öğrenciler Listeleniyor”;
}

@if ([Link]() > 0)


{

<table class=”table”>
<thead>
<tr>
<th>
@[Link](model => [Link])
</th>
<th>
@[Link](model => [Link])
</th>
<th>
@[Link](model => [Link])
</th>
<th>
@[Link](model => [Link])
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td>

148
WEB PROGRAMLAMA 2

@[Link](modelItem => [Link])


</td>
<td>
@[Link](modelItem => [Link])
</td>
<td>
@[Link](modelItem => [Link])
</td>
<td>
@[Link](modelItem => [Link])
</td>
<td>
@[Link](“Editle”, “Edit”, new { }) |
@[Link](“Detaylar”, “Details”, new {}) |
@[Link](“Sil”, “Delete”, new { })
</td>
</tr>
}
</tbody>
</table>
}
else
{
<h5 align=”center”> Herhangi bir öğrenci Kaydı yok.</h5>
}

Şimdi kodumuzda menü işlemlerini halledelim Shared klasörü altındaki _


[Link] dosyasındaki üst menünün oluşturulduğu aşağıdaki kısmı
<div class=”[Link]-collapse collapse d-sm-inline-flex justify-content-
between”>
<ul class=”[Link]-nav flex-grow-1”>
<li class=”nav-item”>
<a class=”nav-link text-dark” asp-area=”” asp-controller=”Home” asp-
action=”Index”>Home</a>
</li>
<li class=”nav-item”>
<a class=”nav-link text-dark” asp-area=”” asp-controller=”Home” asp-
action=”Privacy”>Privacy</a>
</li>
</ul>
</div>
yine aşağıdaki kod bloğu ile değiştirelim.

149
<div class=”[Link]-collapse collapse d-sm-inline-flex justify-content-
between”>
<ul class=”[Link]-nav flex-grow-1”>
<li class=”nav-item”>
<a class=”nav-link text-dark” asp-area=”” asp-controller=”Ogrenci” asp-
action=”Ekle”>
Öğrenci Ekle
</a>
</li>
<li class=”nav-item”>
<a class=”nav-link text-dark” asp-area=”” asp-controller=”Ogrenci” asp-
action=”Listele”>
Tüm Öğrenciler
</a>
</li>
</ul>
</div>
Projemizin çalıştırıldığında OgrenciContoller’ı altında index action metodu ile
çalıştırılması için [Link] klasörünün aşağıda yer alan kısmını da
[Link](endpoints =>
{
[Link](
name: “default”,
pattern: “{controller=Home}/{action=Index}/{id?}”);
});
varsayılan controller “Ogrenci” olacak şekilde güncelleyelim.
[Link](endpoints =>
{
[Link](
name: “default”,
pattern: “{controller=Ogrenci}/{action=Index}/{id?}”);
});
Oluşturduğumuz mini projemiz artık çalışmaya hazır haldedir. Programı
çalıştırdığımızda bizi Görsel [Link] benzer bir ekran karşılar.

150
WEB PROGRAMLAMA 2

Görsel 53. Proje Giriş Sayfası

Yukarıda yer alan Öğrenci Ekle menüsüne tıkladığımızda OgrenciController’ı


altında Ekle action metodu çalışacaktır. Bu ekranda yer alan bilgileri girmeden
Ekle tuşuna bastığımızda kullanıcı taraflı doğrulama gerçekleşecek ve Görsel [Link]
gözüken hata mesajları verilecektir.

151
Görsel 54. Öğrenci Ekleme aşamasında çalışan kullanıcı taraflı
doğrulama

Form verileri istenen şekilde doldurulup Ekle tuşuna basıldığında form,


OgrenciController’ı altında Kaydet isimli action metoda gönderilmiş olur. Burada
Anahtar Kavram da form verilerine ait doğrulama işlemi sunucu taraflı olarak kontrol edilmiştir.
Sunucu: Bir ağda diğer kullanı-
cılar (istemci) tarafından erişilen
Eğer herhangi bir hata durumu yoksa form ile gönderilen ogr nesnesi Ogrenciler
kaynakları barındıran bilgisayar listesine eklenmiştir. (Burada veri tabanına ekleme işlemleri [Link] benzer şekilde
birimidir. gerçekleştirilebilir) Ekleme işleminden sonra eklenen ogr nesnesi Kaydet view’ine
gönderilerek burada ekrana basılmıştır.

152
WEB PROGRAMLAMA 2

Görsel 55. Form ile Gönderilip İşlenen Öğrenciye Ait Bilgiler

Son olarak da eklenen öğrencilerin listelendiği “Tüm Öğrenciler” menüsüne


tıklandığında Görsel [Link] gibi eklenen tüm öğrenciler listelenecektir.

Görsel 56. Eklenen Öğrencilerin Listelenmesi

153
Bu Bölümde Ne Öğrendik?

* Veri doğrulama, kullanıcıdan alınan verilerin beklenen veri türünde, izin verilen aralıkta olması ve
gerekli olan tüm verilerin mevcut olduğundan emin olunması anlamına gelmektedir.

* Kontrol sürecinin ilk kısmı verilerin kontrol edilerek, istenen kısıtlamalar dâhilinde olup
olmadığıdır. İkinci kısım ise verinin hatalı olması durumunda gerekli geri bildirimler ile
kullanıcının sorunu algılamasını sağlamak ve sorunu düzeltmesine yardımcı olmaktır.

* Veri girişi yapıldığında, verilerin doğru biçimde ve uygulama tarafından belirlenen kısıtlamalar dahilinde
olup olmadığının kontrolü, istemci tarafı doğrulama (client-side validation) ve sunucu tarafı doğrulama
(server-side validation) şeklinde olabilir.

* İstemci taraflı model doğrulama tag helper’lar yardımı ile JQuery ile gerçekleştirilebilirken,
sunucu taraflı doğrulama modelin bağlandığı form sunucuya gönderildiğinde sunucu tarafında
gelen verilerin kontrolü ile olmaktadır.

* Model doğrulama, uygulama tarafından alınan verilerin modele bağlanmaya uygun olmasını sağlama
süreci olarak ifade edilmektedir.

* Uygulamalarımızda veri doğrulama kontrollerinin hem istemci hem de sunucu taraflı olması
gerekmektedir.

154
WEB PROGRAMLAMA 2

Kaynakça
[Link] [Link]
Form_validation on

[Link] us/aspnet/core/mvc/mo- [Link]


dels/validation?view=aspnetcore5.0 tion/

[Link] [Link]
re-3-1/ [Link]

155
Bölüm Soruları
1) Model doğrulama nedir?
a) Uygulama tarafından alınan verilerin modele bağlanmaya uygun olmasını
sağlama sürecidir.
b) Modelin oluşturulması sürecidir.
c) Controller’dan view’e model aktarma sürecidir.
d) Controller oluşturma sürecidir.
e) View oluşturma sürecidir.

2) …….
public int Yas { get; set; }
Yas özelliğinin 0-5 aralığında tanımlanması için … ile belirtilen yere ne
gelmelidir?
a) int yas[1-5]
b) [Range(0, 5)]
c) if(yas>0)
d) if(yas>=0 || yas =<5)
e) if(yas>=0 && yas <5)

3) Sunucu taraflı model doğrulaması gerçekleştirilirken aşağıdakilerden


hangisi kullanılabilir?
a) Html
b) Jquery
c) Javascript
d) ModelState
e) Ajax

4) [Link] Core MVC projelerinde model doğrulamanın istemci tarafında


olması için varsayılan olarak hangi kütüphane kullanılmaktadır?
a) View
b) Html
c) ModelState
d) Ajax
e) Jquery

5) Model doğrulama işlemi nerede gerçekleştirilebilir?


a) Sadece sunucu tarafında
b) Sadece istemci tarafında
c) Hem sunucu hem istemci tarafında
d) Sadece Controller’da
e) Sadece View’de

156
WEB PROGRAMLAMA 2

6) Bir [Link] Core MVC uygulamasında model doğrulamanın sunucu


tarafında gerçekleşmesi için hangi kod kullanılabilir?
a) [Link]
b) [Link]
c) [Link]
d) [Link]
e) [Link]

public string Sifre { get; set; }


[….("Sifre",ErrorMessage ="Şifreler eşleşmiyor")]
public string SifreTekrar { get; set; }

7) Yukarıda model sınıfındaki iki özelliğin birbiri ile eşleşip eşleşmediğinin


kontrolü için ... ile belirtilen yere aşağıdakilerden hangisi gelmelidir?
a) Compare
b) Display
c) Control
d) ControlModel
e) Required

[…1…(…2…=" Kullanıcı Adı Alanı Zorunludur")]


public string Kullanici { get; set; }
8) Yukarıda Kullanici adlı özelliğinin model doğrulama ile zorunlu bir alan
olduğunu belirtmek için 1 nolu boşluğa hangi öz nitelik gelmelidir?
a) Compare
b) Display
c) Control
d) ControlModel
e) Required

[…1…(…2…=" Kullanıcı Adı Alanı Zorunludur")]


public string Kullanici { get; set; }
9) Model doğrulama ile zorunlu bir alan olduğu 1 nolu boşlukta yer alan ifade
ile belirtilen Kullanici adlı özellik için “Kullanıcı Adı Alanı Zorunludur”
hata mesajının oluşması için 2 nolu boşluğa hangi öz nitelik gelmelidir?
a) ErrorMessage
b) ErrorMsg
c) Required
d) ErrMsg
e) Message

157
…………….
public string KullanciAdi { get; set; }

10) KullaniciAdi özelliğinin minimum 10 karakterli olarak kullanıcıdan


istenmesini sağlayan öz nitelik aşağıdaki seçeneklerden hangisinde
doğru olarak verilmiştir?
a) [Length(10)]
b) [MinLength(10)]
c) [Min(10)]
d) [Minimum(10)]
e) [Maximum(10)]

Cevaplar
1-a 2-b 3-d 4-e 5-c 6-e 7-a 8-e 9-a 10-b

158
8. LINQ - LANGUAGE INTEGRATED QUERY
(DİLE ENTEGRE SORGU)

Asla yanlış yapmamış insan,


yeni hiçbir şey denememiştir.
Albert Einstein
Ders videosunu izlemek için
QR kodu taratın.

Kazanımlar Birlikte Düşünelim


• LINQ teknolojisini ve bu teknolojinin getirdiği avantajları
bilebilir ve açıklayabilir. 1. LINQ nedir ve ne amaçla kullanı-
• Sık kullanılan LINQ sorgu operatör ve metotlarını bilip lır?
uygulayabilir.
• LINQ sorgularının yürütülme ve söz dizimi yöntemlerini 2. LINQ kullanım avantajları neler-
öğrenebilir. dir?
• LINQ ile çeşitli veri kaynaklarından sorgulamalar yapabilir.
3. LINQ sorguları nasıl işletilir?
Başlamadan Önce
Bir önceki bölümde veri ve model doğrulama konuları anlatılmış, 4. Sık kullanılan LINQ sorgu ope-
örnek bir uygulama ile öğrencilerimizin konuyu pekiştirmesi ratör ve metotları nelerdir ve
sağlanmıştır. Bu bölümde ise dile entegre sorgular (LINQ) konusu bunlar nasıl kullanılır?
işlenecektir. Bir veri kaynağındaki verileri paylaşmak, yönetmek,
sorgulamak, düzenlemek son derece önemlidir. Verilerin belirli koşullar
dahilinde filtrelenmesi, işlenmesi hemen hemen tüm uygulamalarda
yaygın olarak kullanılmaktır. Uygulamada kullanılan veri kaynağı çeşidi
arttıkça farklı veri kaynakları için farklı sorgu mekanizmalarının da
öğrenilip kullanılmasını beraberinde getirir.
159
8.1. Giriş
Sorgu, bir veri kaynağından veri veya bilgi talebi isteyen bir ifadedir. Sorgular
genellikle özel bir sorgu dilinde ifade edilir. Çeşitli veri kaynakları türleri için
Okuma Önerisi
Kıran, S. (2021). İlişkisel Vertabanı
(ilişkisel veri tabanları için SQL ve XML için XQuery vb.) farklı farklı sorgu yapıları
Tasarlama ve SQL ile Geliştirme. İs- mevcuttur. Geliştiriciler için, kullanmaları gereken her veri kaynağı veya veri
tanbul: Nobel Akademik Yayıncılık. biçimi için yeni bir sorgu dili kullanmak zahmetli bir süreçtir. Dile Entegre Sorgu
(LINQ-Language-Integrated Query), çeşitli veri kaynakları ve biçimleri arasında
verilerle çalışmak için tutarlı bir model sunarak bu durumu basitleştirir.
LINQ, sorgu yeteneklerinin doğrudan C# dilinin entegrasyonuna dayalı
olduğu bir dizi teknolojinin adıdır. Geleneksel olarak verilere yönelik sorgular,
derleme zamanında veya IntelliSense desteğinde tür denetimi olmaksızın basit
string7 yapıları olarak ifade edilir ve her veri kaynağı türü için farklı bir sorgu
Çizim
dili öğrenilmesi gerekir. LINQ ile; SQL veri tabanları, [Link] Dataset’ler, XML
dokümanları, IEnumerable veya generic IEnumerable<T> interface’ini destekleyen
.Net koleksiyonları gibi farklı veri kaynakları üzerinde aynı temel sorgu ifadesi
kalıpları kullanılabilir.

LINQ Query

Other
Object [Link] XML Entity SQL Data-
Collection DataSet Document Framework Database Sources

By
LINQ to LINQ to LINQ to LINQ to LINQ implementing
Objects DataSet XML Entity SQL IQueryable

Çizim 7. LINQ farklı veri kaynaklarında kullanımı

160
WEB PROGRAMLAMA 2

Şekil 10. LINQ’nun Avantajlarından Bazıları

Bir LINQ sağlayıcısının kullanılabildiği diğer tüm biçimlerde verileri


sorgulamak ve dönüştürmek için aynı temel kodlama modelleri kullanılır. (LINQ
kullanabilmek için [Link] namespace’i projeye eklenmelidir.) Tüm LINQ
sorgu işlemleri; veri kaynağına erişim, sorgu ifadesi oluşturulması ve sorgunun
işletilmesi şeklinde üç farklı eylemden oluşur.
string txt=””;
// 1. Veri Kaynağı
İnt[ ] sayilar = new int[7] { 0, 1, 2, 3, 4, 5, 6 };

// 2. Sorgu ifadesi.
// SayiQuery IEnumerable<int> tipinde
var SayiQuery =
from sayi in sayilar
where (sayi % 2) == 0
select sayi;

// 3. Sorgunun işletilmesi
foreach (int deger in SayiQuery)
{
txt = txt + “ - “ + deger;
}
161
Yukarıdaki kodda sorgu ifadesinde from sayi in sayilar kodu, sayilar
koleksiyondaki her nesneden anlamına gelir. (Bir foreach döngüsüne benzer
foreach(sayi in sayilar) gibi) Tüm nesnenin tamamı seçilebileceği gibi yalnızca
bazı özellikleri de seçilebilir. From anahtar kelimesinden sonra, koleksiyonun
ögelerini filtrelemek, gruplandırmak, birleştirmek için farklı standart sorgu
operatörleri kullanılabilir. Yukarıdaki kodda Where operatörü ardından gelen
koşul ile her bir koleksiyon içinde nesnenin çift sayı olanlarını bulma şartı
gerçekleşmektedir. LINQ sorgu söz dizimi bir Select veya Group ile biter. Select
verileri şekillendirmek için kullanılır. Yukarıdaki örnekte, çift sayı olan tüm
elemanlar seçilmiş ve SayiQuery adlı değişkene aktarılmıştır.
LINQ ile birlikte lambda ifadesi (=>) de kullanılabilmektedir. Lambda
ifadesi, bazı özel söz dizim yapıları ile anonim metotlar (anonymous method)
oluşturmanın kısa bir yoludur. Örneğin yukarıdaki sorgu ifadesi lambda ifadesi
ile aşağıdaki gibi daha basit hale getirilebilir.
var SayiQuery = [Link](x => x % 2 == 0);
Burada x ile belirtilen input parametresidir. (x yerine başka bir değişken adda
kullanılabilir) x % 2 == 0 ise bu input parametresi geldikten sonra işletilecek
ifadedir. Kodun tam olarak anlamı anonim bir fonksiyona x parametre olarak
gönderilmiş (sayilar dizisi içerisindeki her bir eleman) ve şart gereği çift sayılar
döndürülmüştür.

8.2. LINQ Sorgularının Yürütülmesi


LINQ ile oluşturulan sorgular anlık sorgu yürütme (Immediate query
execution), ve ertelenmiş sorgu yürütme (Deferred query execution) olarak ikiye
ayrılır. Aşağıda bu kavramlar açıklanmıştır.

8.2.1. Ertelenmiş Sorgu Yürütme (Deferred Query Execution)


Bu sorgu yürütme tekniği ile gereksiz kod işletilmesi önlenerek performans
büyük ölçüde arttırılır. Bu teknik ile değer döndüren bir sorguda, sorgu
değişkeninin kendisi hiçbir zaman sorgu sonuçlarını tutmaz, yalnızca sorgu
komutlarını depolar. Sorgunun yürütülmesi, sorgu değişkeni bir foreach
veya For vb. işletilene kadar ertelenir. Diğer bir deyişle, sorgu yürütme, sorgu
oluşturulduktan bir süre sonra gerçekleşir. Bu da bir sorgunun oluşturulup
Anahtar Kavram istenen sıklık ile çalıştırılabileceği anlamına gelir. Örneğin başka uygulamalar
Veri tabanı: Bilgisayar kullanımın-
da çözüme erişmek için işlenebilir tarafından sürekli güncellenen bir varitabanında bu yaklaşım kullanışlı olabilir.
duruma getirilmiş bilgi ortamıdır. Böyle bir durumda sorgu oluşturulduktan sonra, sorgu tekrar tekrar yürütülerek
Bu ortamda yapılandırılmış veri-
lerin depolanması ve kullanılması
her bir yürütme de sorguya ait güncel bilgiler döndürülebilir.
sağlanır. Ertelenmiş yürütmede sorgu işletildiğinde sorguya ait son veriler cevap
olarak döndürülür. Örneğin aşağıdaki gibi action metot, yazıp bu metodu
çağırdığımızda, sayilar[1] = 8; nolu atama ile tek sayı değerli olan dizi[1] değeri
çift sayı değerine atanmıştır. Bu dizi için çift sayı değerlerini döndürmek üzere
oluşturduğumuz sorgu foreach döngüsü ile yürütüldüğünde, bu atama döngüden

162
WEB PROGRAMLAMA 2

önce gerçekleştiğinden bu durum dönen sonuca yansıyacaktır. Aşağıdaki action


metot çağrıldığında metodun geri döndürdüğü değer - 0 - 8 - 2 - 4 – 6 şeklinde olur.
public string Deneme()
{
string txt = “”;
int[] sayilar = new int[7] { 0, 1, 2, 3, 4, 5, 6 };
var SayiQuery =
from sayi in sayilar
where (sayi % 2) == 0
select sayi;
sayilar[1] = 8;
foreach (int deger in SayiQuery)
{
txt = txt + “ - “ + deger;
}

return (txt);
}

8.2.2. Anlık Sorgu Yürütme (Deferred Query Execution)


Anlık sorgu yürütme, ertelenmiş yürütmenin tersidir. LINQ sorgusunu
yürütmeye zorlar ve sonucu hemen alır. Anlık olarak hesaplanması gereken
Average (Ortalama), Count (Adet), First (İlk) ve Max (Maksimum) gibi durumlarda
sorgunun hemen yürütülmesi gerekir.
public string Deneme()
{

string txt = “”;


int[] sayilar = new int[7] { 0, 1, 2, 3, 4, 5, 6 };
var SayiQuery =
(from sayi in sayilar
where (sayi % 2) == 0
select sayi).ToList();

sayilar[1] = 8;
txt = “Toplam Çift Eleman = “ + [Link]+”\n”;
foreach (int deger in SayiQuery)
{
txt = txt + “ - “ + deger;
}

return (txt);

163
}
Yukarıdaki kod incelendiğinde sorgu anlık olarak ToList() ile işletilmiştir.
Eleman sayısı ve çift elemanların ekrana basıldığı sorgunun işletilmesinden sonra
sayilar[1] = 8 ile yapılan atamanın, sorguya yansımadığı görülecektir. Yukarıdaki
action metot çağrıldığında geri döndürülecek txt içeriği
Toplam Çift Eleman = 4
-0-2-4–6

şeklinde olur.

8.3. LINQ Sorguları


IQueryable veri kaynaklarına ve IEnumerable koleksiyonlarına LINQ sorgusu
temel olarak Query Syntax(Sorgu söz dizimi) ve Method Syntax(Yöntem söz
dizimi) olarak adlandırılan iki farklı yol ile yazılabilir (Bazı durumlarda bu iki
farklı yöntem birleştirilerek de LINQ sorguları oluşturulabilir). Kod derlendiğinde
sorgu söz dizimi, .NET ortak dil çalışma zamanı (CLR) için yöntem çağrılarına
çevrilmelidir. Bu yöntem çağrıları, Where, Select, GroupBy, Join, Max ve Average
gibi adlara sahip standart sorgu operatörlerini çağırır.
Sorgu söz dizimi ve yöntem söz dizimi anlamsal olarak aynı olsa da sorgu söz
dizimi okunması kolay ve basit olduğundan daha çok tercih edilir. Fakat genel
olarak kullanım şekli sorgu durumuna göre değişiklik gösterir. Bu nedenle,
sorgularda ve sorgu ifadelerinde her iki yönteme de aşina olmak da yararlı
olacaktır.
int[] dizi = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var sonucQuery = from herbirSayi in dizi
where herbirSayi > 5
select herbirSayi;

Yukarıda örnek kod bloğu ile sorgu söz dizimi kullanarak dizi elemanlarından
5’ten büyük olanlar elde edilirken, aşağıdaki kod bloğunda dizi ile aynı içeriğe
sahip dizi2’de 5’ten büyük sayılar yöntem söz dizimi kullanılarak elde edilmiştir.
int[] dizi2 = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var sonucMethod = [Link](x => x > 5).ToList();

8.4. Sık Kullanılan LINQ Sorgu Operatör ve Metotları


Aşağıda yer alan Kitap sınıfı ve Kitap nesnelerinden oluşan Kitaplar listesi için
örnekler oluşturulmuştur. Bu örneklerden elde edilen sonuç değerleri view’lere
İpucu model olarak aktarılıp, (Model verilerin aktarılması başlığında incelenmiştir)
Entity Framework Core (EF Core) ko-
nusuna 9. bölümde yer verilecektir.
view’ler içerisinde ilgili veriler for, foreach vb. döngü ifadeleri ile gösterilebilir.
Aynı zamanda tüm bu LINQ sorgulama işlemlerinin 9. bölümde de inceleyeceğimiz
veri tabanı işlemlerinde de kullanılabilir olduğu unutulmamalıdır.
public class Kitap

164
WEB PROGRAMLAMA 2

{
public int KitapID { get; set; }
public string KitapAdi { get; set; }
public string YazarAdi { get; set; }
public int KitapSayfasi { get; set; }

}
List<Kitap> Kitaplar = new List<Kitap>() {
new Kitap(){KitapID= 1,KitapAdi = “Suç Ve Ceza”,YazarAdi=”Dostoyevski”,
KitapSayfasi = 690} ,
new Kitap(){KitapID= 2,KitapAdi = “Karamazov
Kardeşler”,YazarAdi=”Dostoyevski”,KitapSayfasi = 850},
new Kitap(){KitapID= 3,KitapAdi = “Martin Eden”, YazarAdi=”Jack London”,
KitapSayfasi = 520 } ,
new Kitap(){KitapID= 4,KitapAdi =”İki Şehrin Hikayesi”,YazarAdi=”Charles
Dickens”,KitapSayfasi= 400},
new Kitap(){KitapID= 5,KitapAdi = “Satranç” ,YazarAdi=”Stefan Zweig”,
KitapSayfasi = 90 }
};

Şekil 11. Sık Kullanılan LINQ Sorgu Operatör ve Metotları

8.4.1. Where Operatörü


Bir veri kümesi içerisinde gerçekleştirebileceğimiz en temel ve en güçlü
işlemlerden biri, veri kümesi üzerinde gerekli olan verileri filtrelemektir. Where
operatörü veri kümesinde verilen kriterlere göre filtreleme yapar.

165
Aşağıda sorgu söz dizimi ile verilen Kitaplar listesinde 500 sayfadan büyük
ve 1000 sayfadan küçük kitaplar filtrelenmiştir. Burada x değişkeni ile alınan her
bir kitabın sayfa sayısı kontrol edilmiş ve select ile uygun sayfa sayısındaki kitap
nesneleri sonuc değişkenine atanmıştır. sonuc değişkeninde KitapAdi Suç ve Ceza,
Karamazov Kardeşler ve Martin Eden olan üç tane kitap nesnesi olacaktır.
var sonuc = from x in Kitaplar
where [Link] > 500 && [Link] < 1000
select x;

Aynı sorgu ifadesi yöntem söz dizimi ile aşağıdaki şekilde de elde edilebilir.
Burada da Kitaplar listesinde her bir kitap elemanı x ile anonim bir metoda
parametre olarak gönderilmiş ve her bir kitap elemanında belirtilen aralıkta sayfa
sayısına sahip kitaplar sonuc2 değişkenine aktarılmıştır.

var sonuc2 = [Link](x => [Link] > 500 && [Link]


< 1000);

8.4.2. OrderBy- OrderByDescending Operatörü


OrderBy sıralama operatörü sorgu söz diziminde, koleksiyonun ögelerini
artan veya azalan düzende sıralar. Koleksiyon varsayılan olarak artan düzende
sıralar. Koleksiyonu azalan düzende sıralamak için descending anahtar kelimesi
kullanılır. Yöntem söz dizimi kullanıldığında artan düzende sıralama yine OrderBy,
azalan düzende sıralama ise OrderByDescending operatörü ile gerçekleştirilir.
Aşağıda sorgu söz dizimi ile KitapAdi’na göre düzenleme yapılmıştır.
var sonuc3 = from x in Kitaplar
orderby [Link]
select x;

sonuc3 değişkenine İki Şehrin Hikayesi, Karamazov Kardeşler, Martin Eden,


Satranç, Suç ve Ceza ismi doğrultusunda sıralanan şekilde kitap nesneleri
atanacaktır. Bu işlem yöntem söz dizimi ile aşağıdaki şekilde gerçekleştirilebilir:
var sonuc4 = [Link](x => [Link]);
Kitapların isimlere göre tersten sıralanması sorgu söz dizimi ile
var sonuc5 = from x in Kitaplar
orderby [Link] descending
select x;

yöntem söz dizimi ile ise


var sonuc6 = [Link](x => [Link]);
şeklindedir.

166
WEB PROGRAMLAMA 2

8.4.3. Group By Operatörü


LINQ’da gruplama operatörleri, ortak öz nitelikleri içeren dizi veya
koleksiyonun ögelerini seçerek ve bunları bir grupta sunar. Başka bir deyişle,
gruplama operatörüne verilen anahtara göre elemanları gruplar.
Yazar adlarına göre gruplama yapılmak istendiğinde sırayla sorgu ve yöntem
söz dizimleri için yazılabilecek kodlar aşağıdadır:
var sonuc7 = from s in Kitaplar
group s by [Link];
var sonuc8 = [Link](s => [Link]);
Burada her grup, üzerinde grup işleminin gerçekleştirildiği bir özellik adına
sahip alacaktır. Yukarıdaki örnek için, grup oluşturmak için kullanılan YazarAdi
grup özellik adı olarak gruba ait key içinde bir kez yer alacaktır.
string txt = “”;
foreach (var item in sonuc7)
{
txt=txt+” - “+[Link] ;
}
Foreach döngüsü çalıştırıldığında YazarAdi’na gruplama yapıldığından txt
değişkeninin içinde her bir yazar adı aşağıdaki gibi bir kere yer alacaktır.
- Dostoyevski - Jack London - Charles Dickens - Stefan Zweig

8.4.4. Select Operatörü


Select operatörü SQL’de kullanıldığında hangi sütunları sorguda almak
istediğimizi belirtmemize olanak tanımaktaydı. LINQ’da da benzer şekilde,
istediğimiz bazı özellikleri ya da tüm özellikleri belirtip seçmemize olanak tanır.
Örneğin kitap sayfası 500’den fazla olan kitaplara ait sadece yazar adlarını
getiren bir sorgu yazılmak istendiğinde sırayla sorgu ve yöntem söz dizimleri için
yazılabilecek kodlar aşağıdadır:
var sonuc9 = (from x in Kitaplar
where [Link]>500
select [Link]).ToList();
var sonuc10 =[Link](x => [Link] > 500).Select(x => [Link]).
ToList();
Burada dikkat edilirse .ToList() ile anlık sorgu yürütme gerçekleştirilmiştir.
Aşağıda bir başka örnek select yöntemi ile Kitaplar listesindeki KitapAdi ve
KitapSayfasi özellikleri Ad ve Sayfa adlı özelliklere atanarak anonim bir liste
koleksiyonu döndürmüştür.
var sonuc11 = [Link](s => new
{
Ad = [Link],
Sayfa = [Link]
}).ToList() ;

167
8.4.5. Contains-Any-All Metotları
Contain() metodu, koleksiyonda belirtilen bir ögenin olup olmadığını kontrol
eder ve bir boolen bir değer döndürür. Aranan öge koleksiyonda varsa True, yoksa
False değeri döndürür. Aşağıda ilk olarak Kitaplar listesine k adlı bir kitap nesnesi
oluşturularak eklenmiştir. Daha sonra sırayla sorgu ve yöntem söz dizimleri için
contain kullanımı gösterilmiştir.
Kitap k = new Kitap(){KitapID = 8, KitapAdi = “x”, YazarAdi = “y”, KitapSayfasi
= 10 };
[Link](k);
var sonuc12 = [Link](k); //returns true

var sonuc13 = (from ktp in Kitaplar //returns true


select ktp).Contains(k);
Any() metodu, bir veri kaynağının ögelerinden en az birinin belirli bir koşulu
karşılayıp karşılamadığını kontrol etmek için kullanılır. Ögelerden herhangi biri
verilen koşulu sağlıyorsa, true döndürür, aksi takdirde false döndürür. Ayrıca
bir koleksiyonun veri içerip içermediğini kontrol etmek için de kullanılabilir.
Aşağıdaki kod Kitaplar listesinde eleman olduğundan sonuc14 değişkenine true
değeri döndürecektir.
var sonuc14 = [Link]();
All() metodu bir veri kaynağının tüm ögelerinin belirtilen koşulu karşılayıp
karşılamadığını kontrol eder. Tüm ögeler şartı karşılıyorsa true, karşılamıyorsa
false değeri döndürür. Aşağıda Kitaplar listesindeki tüm kitapların sayfa
sayılarının 500-1000 arasında olup olmadığı kontrol edilmiştir. Tüm kitaplara ait
sayfa sayıları bu aralıkta olmadığından sonuc15 değişkeni false değerini alacaktır.
var sonuc15 = [Link](x => [Link] > 500 && [Link] <1000);

8.4.6. Count Metodu


Koleksiyonda bulunan tüm ögelerin veya belirli bir koşulu karşılayan ögelerin
sayısını döndürmek için kullanılır.
Aşağıdaki kod ile Kitaplar listesi içerisinde 500’den küçük sayfa sayısına sahip
kitap sayısı geri döndürülmüştür. İlk tanımlı kitaplar listesini düşündüğümüzde
sonuc17 değişkeni 2 değerini alacaktır.
var sonuc17 = [Link](x => [Link] < 500);
Kitaplar listesinde Count() metodu hiç parametre almadan kullanılsaydı
listedeki toplam eleman sayısını verirdi (sonuc18 değişkeni 5 değerini alır).
var sonuc18 = [Link]();

8.4.7. Max- Min- Sum-Avarage Metotları


Max() metodu uygulandığı koleksiyondan en büyük sayısal değeri döndürmek
için kullanılır. Kitap listesinde bulunan kitaplardan en yüksek sayfa sayısını veren
kod aşağıda yer almaktadır. Burada sonuc18 değişkeni 850 değerini alır.

168
WEB PROGRAMLAMA 2

var sonuc18 = [Link](s=>[Link]);


Min() metodu uygulandığı koleksiyondan en küçük sayısal değeri döndürmek
için kullanılır. Kitap listesinde bulunan kitaplardan en az sayfa sayısını veren
kod aşağıda yer almaktadır. Burada sonuc19 değişkeni en az sayfa sayısı olan 90
değerini alır
var sonuc19 = [Link](s=>[Link]);
Sum() metodu, koleksiyondaki sayısal ögelerin toplamını döndürmek için
kullanılır. Kitaplar listesindeki kitaplara ait toplam sayfa sayısı aşağıdaki gibi
hesaplanabilir.
var sonuc20 = [Link](s => [Link]);
Burada sonuc20 değişkeni Kitaplar listesindeki tüm kitapların sayfa sayıları
toplamı olan 2550 değerini alacaktır.
Average() metot, uygulandığı koleksiyondaki sayısal değerlerin ortalamasını
hesaplamak için kullanılır. Bu yöntem ondalık, kayan nokta veya çift değer
döndürebilir. Ortalama hesaplanacak değerlerde Null değer var ise bu ortalamaya
katılmaz. Kitaplar listesindeki tüm kitapların sayfa sayıların ortalamasını veren
kod aşağıda yer almaktadır. Burada sonuc21 değeri 510 değerini alır.
var sonuc21 = [Link](s => [Link]);

8.4.8. First- FirstOrDefault Metotları


Bu yöntem için iki aşırı yüklenmiş sürüm mevcuttur. First metodunun hiçbir
parametre almayan hali veri kaynağından ilk ögeyi döndürürken, parametre
olarak bir koşul belirtilen ikinci hali belirtilen koşulu karşılayan ilk ögeyi
döndürür. İlk durum için veri kaynağı boşsa bu yöntem bir hata fırlatır. İkinci
durumda ise koşulu sağlayan herhangi bir öge yoksa hata fırlatır.
Aşağıda Kitaplar listesinde KitapId’si çift olan ilk kayıt sonuc22 değişkenine
atanmıştır. Eğer bu şartı sağlayan bir kayıt olmasaydı bu metot hata fırlatırdı (Try-
Catch-Finaly blokları ile uygulamada meydana gelen hatalar yakalanabilir).
var sonuc22 = [Link](x => [Link] % 2 == 0);
FirstOrDefault() metodu, First() metodunda olduğu gibi hiç bir parametre
almayan hali veri kaynağından ilk ögeyi, parametre olarak bir koşul belirtilen
ikinci hali ise belirtilen koşulu karşılayan ilk ögeyi döndürür. First() metodundan
farklı olarak koşul ölçütleri ile eşleşen bir kayıt yoksa FirstOrDefault() boş değerleri
işleyebilir ve bir istisna fırlatmaz. Bu metot bunun yerine ögenin veri türüne göre
varsayılan değer (null vb.) döndürür. First yöntemi gibi, FirstOrDefault yöntemi
için de aşırı yüklenmiş parametre almayan ve parametre olarak bir koşul belirtilen
iki sürüm vardır.
Aşağıda Kitaplar listesinde KitapID’si 5 ten büyük ilk kayıt aranacaktır. Böyle
bir kayıt olmadığından sonuc23 FirstOrDefault() metodundan gelen Null değerini
alır.
var sonuc23 = [Link](x => [Link] > 5);

169
Yukarıdaki örneklerde görüldüğü gibi LINQ ile nesneler sorgulanabileceği
gibi, SQL veri tabanı, [Link] Veri Kümeleri, XML nesneleri ve IEnumerable veya
IEnumerable<T> arabirimini uygulayan tüm nesne koleksiyonları da dâhil olmak
üzere farklı veri koleksiyonlarında aynı sorgu ifadesi kalıpları kullanılabilmektedir.
Kısaca LINQ daha az ve anlaşılabilir bir kod yapısı ile beraber birden çok türdeki
veri koleksiyonlarını işlemek için aynı sorguları kullanmamıza izin verir.

170
WEB PROGRAMLAMA 2

Bu Bölümde Ne Öğrendik?

* LINQ (Language Integrated Query) çeşitli veri kaynaklarından aynı sorgu söz dizimi ile verileri alıp
kullanmamıza olanak sağlayan bir teknolojidir.

* LINQ, sorgu yeteneklerinin doğrudan C# dilinin entegrasyonuna dayalı olduğu bir dizi teknolojidir.

* LINQ ile veri kaynaklarına erişip sorgular yazmanın derleme zamanında hata kontrolü, IntelliSense
desteği, farklı kaynaklar için aynı söz dizim kullanma vb. avantajları bulunmaktadır.

* LINQ ile oluşturulan sorgular anlık sorgu yürütme (Immediate query execution) ve ertelenmiş
sorgu yürütme (Deferred query execution) olarak ikiye ayrılmaktadır.

* Ertelenmiş sorgu yürütme tekniği ile değer döndüren bir sorguda, sorgu değişkeninin kendisi hiçbir zaman
sorgu sonuçlarını tutmaz, yalnızca sorgu komutlarını depolar. Sorgunun yürütülmesi, sorgu değişkeni
bir foreach, For vb. işletilene kadar ertelenir.

* Anlık sorgu yürütme, ertelenmiş yürütmenin tersidir, LINQ sorgusunu yürütmeye zorlar ve
sonucu hemen alır.

* LINQ ile sorgular Query Syntax(Sorgu söz dizimi) ve Method Syntax(Yöntem söz dizimi) olarak adlandırılan
iki farklı yol ile yazılabilmektedir (Bazı durumlarda bu iki farklı yöntem birleştirilebilir.)

171
Kaynakça
[Link] [Link]
ramming-guide/concepts/linq/
[Link]
[Link]
[Link]
rated-query-nedir/ (Şekil 9.1) [Link]
[Link]/linq/linq-tutorials

[Link]
ramming-guide/concepts/linq/query-syntax-and-met-
hod-syntax-in-linq

172
WEB PROGRAMLAMA 2

Bölüm Soruları
var sonuc = from x in Kitaplar
where [Link] > 500
select x;
1) Yukarıdaki kod hangi söz dizim yapısına uygundur?
a) C#
b) Asp
c) Query syntax
d) Method syntax
e) Yukarıdakilerin hepsi

2) LINQ ile filteleme işlemi hangi operatör ile gerçekleştirilebilir?


a) Select
b) Order
c) Descending
d) Where
e) Filter

3) LINQ işlemlerini kullanırken hangi namespace ekli olmalıdır?


a) [Link]
b) [Link]
c) [Link]
d) [Link]
e) Yukarıdakilerin hepsi

int[] sayilar = new int[] { 20, 10, 30, 50,40};


var d=[Link]();
4) Yukarıdaki sorgu için d değeri kaç olur?
a) 10
b) 20
c) 30
d) 40
e) 50

173
public string Sorgu()
{
int[] sayilar = new int[] { 20, 10, 30, 50,40};
var d=[Link](x=>x);
return [Link]().ToString();
}

5) Yukarıdaki Sorgu() action metodu çağrıldığında hangi değer döndürülür?


a) 10
b) 20
c) 30
d) 40
e) 50

int[] sayilar = new int[] { 20, 10, 30, 50,40};


var d=[Link]();
6) Yukarıdaki sorgu için d değeri kaç olur?
a) 50
b) 100
c) 30
d) 120
e) 150

int[] sayilar = new int[] { 20, 10, 30, 50,40};


var d = [Link](x=>x>10);
7) Yukarıdaki sorgu için d değeri kaç olur?
a) 1
b) 2
c) 3
d) 4
e) 5

int[] sayilar = new int[6] {10, 20, 30, 40, 50, 60 };


var sonuc = [Link] (x => x % 15 == 0);
8) Yukarıdaki sorgu için sonuc değeri kaç olur?
a) 0
b) 2
c) 10
d) 15
e) 30

174
WEB PROGRAMLAMA 2

int[] sayilar = new int[6] {10, 20, 30, 40, 50, 60 };


int k=20;
var sonuc = [Link](k);
9) Yukarıdaki sorgu için sonuc değeri ne olur?
a) 10
b) 20
c) 30
d) True
e) False

int[] sayilar = new int[6] { 10, 20, 30, 40, 50, 60 };


var sonuc = [Link](x=>x>20);
10) Yukarıdaki sorgu için sonuc değeri ne olur?
a) 10
b) 2
c) 3
d) False
e) True

Cevaplar
1-c 2-d 3-a 4-c 5-a 6-e 7-d 8-e 9-d 10-e

175
176
9. ENTITY FRAMEWORK CORE
Önce meseleyi çözün. Sonra kodu yazın.
John Johnson

Ders videosunu izlemek için


QR kodu taratın.

Kazanımlar Birlikte Düşünelim


• ORM kavramını bilebilir.
• Data Annotation öz niteliklerini bilebilir ve kullanabilir. 1. ORM (Object Relational Map-
• Entity Framework Core'u projeye ekleyip kullanabilir. ping) kavramı nedir?
• Code First yaklaşımı ile projeler geliştirebilir.
2. Bir ORM aracı olan Entity
Başlamadan Önce Framework Core’da veri tabanı
Geçtiğimiz bölümde LINQ’nun sağladığı avantajlardan bahsederek işlemleri nasıl gerçekleştirilir?
LINQ sorgularının nasıl yürütülebileceğini tartıştık. Aynı zamanda sık
kullanılan LINQ sorgu operatör ve metotlarını incelemiştik. Bu bölümde 3. Code First ve Database First
ise ORM kavramını açıklayıp [Link] Core’da bir ORM aracı olan Entity yaklaşımları nedir?
Framework Core’dan bahsedeceğiz. Günümüz dünyasında verinin artan
önemi ile birlikte iyi bir yazılım yazmak, yalnızca iyi yapılandırılmış, 4. Veri modelimiz data annotati-
verimli koda değil, aynı zamanda bu kodun önemli verileri nasıl yönetip on’lar ile nasıl yapılandırılır?
bunlarla etkileşime girebildiğine de bağlıdır. Bu noktada geleneksel
yaklaşımlar ile veri tabanı sunucusuna bağlantı yapıp kodun içerisinde 5. Code first yaklaşımı ile örnek bir
geleneksel olarak SQL (Structered Query Language) kullanarak proje nasıl oluşturulur?
sorgular yazmak, CRUD (Create, Read, Update, Delete) işlemlerini
gerçekleştirmek, büyüyen gelişen veriler ve yazılım dünyası yenilikleri
ile birlikte çok tercih edilen bir yaklaşım değildir. 177
9.1. Giriş
Yazılım projelerinde çoğu uygulama veri depolamak için bir veri tabanına
ihtiyaç duyar. Veri tabanlarıyla çalışmak, veri tabanına olan bağlantıları
yönetmek, uygulamanızdaki verileri veri tabanının anlayabileceği bir formata
çevirip kullanmak ve çok sayıda başka sorunlarla uğraşmak gibi gerekçelerle
oldukça zahmetli bir süreç olabilir.
Günümüz dünyasında verinin artan önemi ile birlikte iyi bir yazılım yazmak,
yalnızca iyi yapılandırılmış, verimli koda değil, aynı zamanda bu kodun önemli
verileri nasıl yönetip bunlarla etkileşime girebildiğine de bağlıdır. Bu noktada
geleneksel yaklaşımlar ile veri tabanı sunucusuna bağlantı yapıp kodun içerisinde
geleneksel olarak SQL (Structered Query Language) kullanarak sorgular yazmak,
CRUD (Create, Read, Update, Delete) işlemlerini gerçekleştirmek büyüyen gelişen
veriler ve yazılım dünyası yenilikleri ile birlikte çok tercih edilen bir yaklaşım
değildir. Bu noktada ORM (Object Relational Mapping) araçları devreye girmiş
görece bu işi kolaylaştırmıştır.

9.2. ORM (Object Relational Mapping)


Veri tabanı; verilerin bir bilgisayar sisteminde elektronik olarak bir
sistem dâhilinde depolandığı, veriler üzerinde gelişmiş sorgular yapılabildiği
yapılandırılmış bir bilgi veya veri topluluğudur. Bir veri tabanı genellikle bir
veri tabanı yönetim sistemi (DBMS- database management system) tarafından
kontrol edilir. Veriler, DBMS ve bunlarla ilişkili uygulamalar hep birlikte veri
tabanı sistemi olarak adlandırılır. Günümüzde çalışmakta olan en yaygın veri
tabanları türlerindeki veriler, işlemeyi ve veri sorgulamayı verimli hale getirmek
için tipik olarak bir tablo ve tablodaki satırlar ve sütunlar halinde modellenir.
Tablolar arasında ilişkilerin olduğu ve ilişkisel veri tabanı olarak adlandırılan bu
model ile verilere kolayca erişilebilir, veriler kolayca yönetilebilir, değiştirilebilir,
güncellenebilir ve düzenlenebilir. İlişkisel veri tabanı teknolojisi, yapılandırılmış
bilgilere erişmenin verimli ve esnek yolunu sağlar. Bu mimariye sahip çoğu veri
tabanı, veri yazmak ve sorgulamak için yapılandırılmış sorgu dili (SQL) kullanır.
Yazılım dünyasında Nesne Yönelimli Programlama (OOP-Object oriented
programming) ile birlikte, veri tabanı sistemlerini de nesne yönelimli
programlama tekniklerine ait paradigmalar ile birlikte kullanma ihtiyacı ortaya
çıkmıştır. Bu noktada ORM devreye girmiştir. ORM, sınıflar ve nesneler gibi
nesne yönelimli programlama kavramlarını; tablolar ve sütunlar gibi veri tabanı
kavramlarıyla eşleyerek kullanıma olanak sağlayan bir yapıdır. ORM ile tercih
edilen programlama dilinin nesne yönelimli paradigmasını kullanarak karmaşık
sorgular da yazılabilir.

178
WEB PROGRAMLAMA 2

O/R Mapping

Object

MappingLogic
Object
DB

Object

Objects in Memory Relational Database

Çizim 8. Object Relational Mapping [Link]


object-relational-mapping-9d84807f5536 sitesinden alınmıştır

ORM’ler, soyutlama ile nesne yönelimli programın bir modelini oluşturur.


Verinin nasıl yapılandırıldığını bilmeden bir nesne ile veri arasındaki ilişkiyi
haritalama yaparak tanımlar. Veri etkinliklerini yönetmek ve uygulamayı SQL
koduna bağlamak için model kullanılabilir. Bir kez bağlamadan sonra kodun tekrar
tekrar yazılması gerekmez, bu da geliştiriciye çok büyük bir zaman kazandırır.
Çeşitli programlama dilleri için popüler ORM araçları (Object Relational Mapper)
aşağıda listelenmiştir:

Şekil 12. Popüler ORM (Object Relational Mapper) Araçları


179
Bu bölümde [Link] Core uygulamalarında hızlı ve kolay bir şekilde veri
tabanı işlemleri gerçekleştirebileceğimiz bir ORM aracı olan Entity Framework
Core (EF Core) üzerinde duracağız.

9.3. Entity Framework Core (EF Core)


Entity Framework Core, Entity Framework’ün EF 6.x’ten sonraki; açık
kaynaklı, hafif, genişletilebilir ve Entity Framework veri erişim teknolojisinin
platformlar arası kullanılabilen bir sürümüdür. EF Core, .NET 4.5’ten sonraki
sürümlerde kullanılabileceği gibi, esasen .NET Core uygulamalarıyla kullanılmak
üzere tasarlanmış bir ORM aracıdır.
EF Core ilişkisel veri tabanı ile .NET yazılım kodları arasında eşleme yapar.
Eşlemenin nasıl iki taraf için neye karşılık geldiği Tablo [Link] kısaca gösterilmiştir.
EF Core ile SQL komut dosyalarını yazmak yerine, türü kesin olarak belirlenmiş
nesneleri sorgulamak için LINQ kullanarak ve SQL sorguları oluşturma ve yürütme
gibi işlemler de gerçekleştirilebilir.

Tablo 5. Bir veri tabanı ve .NET yazılımı arasında EF Core ile eşlenen
ögeler

İlişkisel Veri tabanı .NET Core


Table (Tablo) Class (Sınıf)
Table columns (Tablo kolonları) Class properties/fields (Sınıf özellikleri, alanları)
Table records (Tablo Kayıtları) .NET Core koleksiyonlarındaki ögeler, nesneler
SQL örnekleri, WHERE .NET Core LINQ , where için Linq kodu Where(p =>

EF Core, code-first ve database-first şeklinde iki yaklaşıma sahiptir.


Code-First microsoft tarafından desteklenen popüler bir yaklaşımdır. Code
First yaklaşımı ile ilk olarak, kavramsal modeli tanımlanan sınıflar oluşturulur.
Daha sonra bu modeller üzerinden EF Core otomatik olarak bir veri tabanı
oluşturur ve model ile veri tabanını eşler.
Database-First yaklaşımında ise EF Core, EF Core komutlarını kullanarak
mevcut veri tabanına dayalı olarak domain ve context sınıfları oluşturur. Bu
yaklaşım EF Core’da sınırlı desteğe sahiptir.

180
Çizim 9 WEB PROGRAMLAMA 2

Entity Context and Entity


Tables Framework Classes

Database-First Approach

Domain Classes Entity


Framework Tables

Code-First Approach
Database

Çizim 9. Code-First ve Database-First Yaklaşımları Anahtar Kavram


SQL (Structured Query Langu-
age): İlişkisel veri tabanlarını
Veri Sağlayıcı (Data provider), bir veri tabanına bağlanmak, komutları yönetmek ve bu veri tabanlarında
yürütmek ve sonuçları almak için kullanılan kütüphanedir. Örneğin, SQL için yer alan veriler üzerinde çeşitli
işlemler gerçekleştirmek için
SQL veri sağlayıcısı, Oracle için Oracle veri sağlayıcısı vb. birçok farklı veri kullanılan standartlaştırılmış bir
tabanına erişmek için farklı bir sağlayıcı model kullanılır. Aşağıda, EF Core için programlama dilidir. MySQL, MS
Access, Oracle, Sybase, Informix,
veri tabanı sağlayıcıları ve NuGet paketleri listelenmektedir. Projede hangi veri
Postgres ve SQL Server gibi İlişki-
tabanı kullanılacaksa ilgili EF Core paketi NuGet paket yöneticisi kullanılarak sel Veri tabanı Yönetim Sistemleri
projeye yüklenmelidir. (RDMS), standart veri tabanı dili
olarak SQL’i kullanır.

181
Şekil 13. EF Core için Veritabanı sağlayıcıları ve NuGet paketleri

9.4. Entity Framework Core’u Projeye Ekleme


EF Core, .NET Core framework’ünün içinde varsayılan olarak yüklü değildir.
Uygulamalarımızda EF Core’u kullanmak için EF Core DB Provider (hangi veri
tabanı yönetim sistemi ile çalışılacaksa ona ait paket) ve EF Core Tools paketlerini
projeye eklememiz gerekmektedir.
Yeni bir projede veri tabanı işlemlerine geçilmeden önce hangi veri tabanı
yönetim sisteminin kullanılacağına karar verilmiş olmalıdır. Bu noktada SQL Server
veri tabanı yönetim sisteminin EF Core ile birlikte kullanılacağı varsayıldığında
proje oluşturulduktan sonra projeye SQL Server’a ait veri sağlayıcısı (Microsoft.
[Link]) eklenmelidir. Bu kütüphane eklendikten sonra
da EF Core komutlarını yürütmek için DB sağlayıcı paketiyle birlikte migrations,
scaffolding vb. işlemler için EF Core Tools paketini de projemize yüklememiz
gerekir.
182
WEB PROGRAMLAMA 2

Görsel 57. Nugget Package Manager

Bunun için Tools>>Nugget Package Manager>>Manage Nuget Packages for


Solution seçenekleri ile paket yükleme ekranına gelir. Burada Browse sekmesinde
EntityFrameworkCore şeklinde bir arama yapılarak gelen ekranda ilk olarak
[Link] paketi yüklenir.

Görsel 58. [Link] ve EntityFrameworkCore.


Tools paket yüklemesi

183
İlk paket yüklemesi seçildiğinde Görsel [Link] gibi yükle seçeneği ile seçilen
paketin projeye eklenmesi sağlanır.

Görsel 59. Paketlerin proje seçilerek projeye yüklenmesi

Yükleme işlemi sırasında, yüklenen paket kendiyle beraber ilişki olan


paketleri yükler veya günceller.

Görsel 60. İlişkili paket yükleme ve güncellemeleri

184
WEB PROGRAMLAMA 2

Aynı yükleme adımları [Link] paketi için de


tekrarlanır. Yüklenen paketler Solution Explorer >> Dependencies >> Packages
altında Görsel [Link] gibi görünmelidir.

Görsel 61. Yüklenen Paketlerin Görüntülenmesi

9.5. Data Annotations ve EF Core’da Data Annotations


Kullanımı
Data Annotations öz nitelikleri (Attributes), EF Core’daki varlık sınıfına veya
özelliklerine varsayılan kuralları geçersiz kılmak için uygulanabilen .NET öz
nitelikleridir. Kullanılabilmeleri için [Link] Core MVC’de model doğrulamada da
projemize eklediğimiz [Link] namespace’i
ile beraber [Link] namespace ’i
de projeye dâhil edilmelidir. [Link] içinde
tanımlı bazı öz nitelikler aşağıda listelenmiştir.
• Key: Bir varlıktaki özelliği primary key yapmak için kullanılır. Varsayılan
olarak sınıf özelliğinin isminde Id geçen özellik, key tanımlanmasa da primary
key olarak ayarlanır. Key öz niteliği kullanıldığında bu varsayılan kuralı geçersiz
kılar.
[Key]
public int OgrId { get; set; }

• TimeStamp: SQL Server veri tabanında zaman damgası veri tipine


sahip bir sütun oluşturur. EF, veri tabanındaki UPDATE deyiminde eş
zamanlılık kontrolünde bu Zaman damgası sütununu otomatik olarak kullanır.
[Timestamp]

185
public byte[] Timestamp { get; set; }

• Required: EF’de uygulandığı bir özellik için veri tabanı tablosunda bir NOT
NULL sütunu oluşturur (Veri doğrulama da kullanıldığını unutmayın).
[Required]
public string KtapAdi{ get; set; }
• MaxLength: Veri tabanındaki ilgili sütunda izin verilen maksimum string
uzunluğunu belirtmek için bir özelliğe uygulanabilir.
[MaxLength(50)]
public string StudentName { get; set; }
Aşağıda [Link] içinde tanımlı
bazı öz nitelikler listelenmiştir:
• Table: Varlık sınıfına uygulandığında veri tabanındaki ilgili tablo ve şema
adı yapılandırılabilir. Aşağıdaki örnek için veri tabanında tablo ismini Student
yapar:
[Table(“Student”)]
public class Ogrenci
{
public int OgrId { get; set; }
public string OgrAd { get; set;
}

Column: bir varlık sınıfındaki özelliğe uygulandığında bir veri tabanı


tablosundaki ilgili sütun adı, veri türü ve sırası yapılandırılabilir.
[Column(“Name”)]
public string StudentName { get; set; }

• ForeignKey: İlişki kurulacak tabloda özellikle bir alanın yabancı anahtar


(foreinkey) olması istendiğinde ForeinKey anahtar kelimesi ile birlikte ilgili
gezinme özelliği (navigation property) adı parametre olarak belirtilebilir (Burada
Yazar isimli navigation property üzerinden Yazar tablosuna ait primary key ile
eşleme olacaktır).

[ForeignKey(“Yazar”)]
public int YazarNo { get; set; }
public Yazar Yazar { get; set; }

• NotMapped: Modelde tanımlanıp veri tabanında oluşturmaması gereken


bir özelliğe uygulanır.

[NotMapped]
public int OgrYas { get; set; }

186
WEB PROGRAMLAMA 2

Şekil 14. [Link]

9.6. Code-First Yaklaşımı ile Proje Oluşturma – Örnek


Uygulama
Entity Framework (EF) Core ve Visual Studio kullanarak Yazarlar ve yazarlara
ait kitaplar’ın veri tabanında “Yazarlar” ve “Kitaplar” isimli tablolar tutulduğu
örnek bir [Link] Core MVC web uygulaması Code-First yaklaşımı ile oluşturulmak
istenmektedir. Code-First yaklaşımında önce model dosyaları oluşturulmalıdır.
Sonra buna bağlı veri tabanındaki tablolar oluşacaktır. Fakat olayın daha kolay
kavranması açısından veri tabanındaki tablolar ve bunlar arasındaki ilişkisel
yapının işlemler tamamlandıktan sonra nasıl olacağı Görsel [Link] gösterilmiştir.

187
Görsel 62. Kitaplar ve Yazarlar tabloları ilişkileri

Yazarlar tablosunda YazarID, Kitaplar tablosunda KitapId primary key olarak


tanımlanmıştır. Ayrıca Kitaplar tablosundaki YazarId alanı foreign key’dir. Görsel
[Link] örnek kayıtlar ile tablolar gösterilmiştir. YazarID’si 1 olan Jack London için
Kitaplar tablosunda 2 kayıt, YazarID’si 2 olan Fyodor Dostoyevky için Yazarlar
tablosunda 3 kayıt mevcuttur. Yazarlar tablosundaki YazarId alanı ile de Yazarlar
tablosu Kitaplar tablosuna bağlıdır.

Görsel 63. Örnek Veriler ile Kitaplar ve Yazarlar tabloları

Biz projemizde code-first yaklaşımı ile modelimiz içerisinde oluşturacağımız


sınıfların hangi tabloya bağlanacağını, sınıflar içerisindeki porperty ve field
(özellik ya da alanın) tablodaki hangi alana karşılık geleceğini, tablonun
özelliklerini (alanı primary key tanımlama, bir alanı auto increment yapma vb.)
tanımlamayı EF Core ile gerçekleştireceğiz. EF core bunları otomatik yapabildiği
gibi yazılımcı tarafından düzenleme yapılmasına da olanak sağlamaktadır.

9.6.1 Veri Modeli Oluşturma


İlk olarak yeni bir [Link] CORE Web App (Model-View-Controller) projesi
oluşturuyoruz.
Solution Explorer kısmında yer alan Model klasörüne sağ tıklayıp Add >>Class
seçeneği ile [Link] ve [Link] isminde iki class oluşturuyoruz.

public class Kitap


{
[Key] // Bu öz nitelik tanımlanmasa da KitapID ‘de ID eki yer aldığından //
primary key olurdu

188
WEB PROGRAMLAMA 2

public int KitapID { get; set; }


[Required]
[MaxLength(100)]
[Display(Name = “Kitap Adı “)]
public string KtapAdi{ get; set; }
public int YazarID { get; set; }
public Yazar Yazar { get; set; }
}
public class Yazar
{
public int YazarID { get; set; }
[Required]
[MaxLength(100)]
[Display(Name = “Yazar Ad”)]
public string YazarAd { get; set; }
[Required]
[MaxLength(100)]
[Display(Name = “Yazar Soyad”)]
public string YazarSoyad { get; set; }
public ICollection<Kitap> Kitaplar { get; set; }
}
Entity Framework modelindeki varlıklar arasındaki ilişkiler, Navigation
Properties (Gezinme Özellikleri) tarafından tanımlanır. Navigation Properties,
kullanılan veri tabanı sağlayıcısının herhangi bir türle eşlenemeyeceği bir
özelliktir. Yukarıdaki her iki sınıf da incelediğinde bu sınıflar içerisinde int, string
vb. mevcut veri tabanı türleriyle eşlenebilen özellikler olduğu gibi Kitap sınıfında
Yazar, Yazar sınıfında Kitap olarak tanımlı özellikler de mevcuttur. Bu özellikler
için veri tabanlarında eşdeğer bir tür yoktur. Bunlar Navigation Properties olarak
görülürler.
Yazar sınıfının tanımında her yazara ait ICollection<Kitap> Kitaplar
koleksiyon gezinme özelliği ile (Kitaplar Collection navigation property) birden
çok kitaba sahip olmasına olanak tanır. Bir çok ilişkideki asıl varlık, koleksiyon
gezinme özelliğine (collection navigation property) sahip olan varlıktır ve bağımlı
varlık, başvuru gezinme özelliğine (reference navigation property) sahip varlıktır.
Yani Kitap sınıfındaki public Yazar Yazar { get; set;} şeklinde tanımlanan Yazar
için Navigation Property tanımı yapılmasa da olur. Burada işlemi kolaylaştırması
açısından her kitabın en fazla bir yazara sahip olmasına izin verir.
NOT: Kitap sınıfında yer alan YazarID alanı, Yazar sınıfında yer alan ve
primary key olarak tanımlı YazarID ile aynı ad ve tipte olduğunda burada foreign
key olarak kullanılacaktır.

189
9.6.2. DbContext Oluşturma
Veri tabanı ile veri modelleri arasındaki koordinasyonu sağlayan sınıftır.
Temel olarak aşağıdaki işlemlerden sorumludur:

Şekil 15. DbContext Sınıfının Sorumlu Olduğu Temel İşlemler

Veri tabanındaki tabloların nesne yönelimli temsilleri olan varlık sınıfları, veri
tabanında saklamak istediğiniz verileri temsil ederler. EF Core’u yapılandırmak,
yönetmek, çalışma zamanında veri tabanına erişmek vb. için uygulamalarda
DbContext kullanılır. DbContext’i uygulamamızda kullanmak için, DbContext’ten
türetilen ve bu bağlam sınıfı içerisinde genellikle modeldeki her varlık için
DbSet<TEntity> özelliklerini içeren bir sınıf oluşturulmalıdır.
Sık Kullanılan DbContext Metodları aşağıda listelenmiştir (NOT örnekler
KitaplikContext k = new KitaplikContext(); e göre verilecektir).
Add: DbContext’e yeni bir varlık ekler ve onu izlemeye başlar. Bu yeni varlığa
ait veriler SaveChanges() çağrıldığında veri tabanına eklenir.
[Link](kitap);
[Link]();

Remove: Belirtilen varlık üzerinde silme işlemini gerçekleştirir. Bu silme


işleminin veri tabanında da olması için SaveChanges() metodu çağrılmalıdır.
[Link](kitap);
[Link]();

190
WEB PROGRAMLAMA 2

Update: Modifiye edilmiş bir varlığa ait değişikliği yapar ve varlığı izlemeye
başlar. SaveChagnes() çağrıldığında veriler kaydedilir.
[Link](kitap);
[Link]();
Find: Parametre olarak verilen birincil anahtar değerine sahip bir varlık bulur.
[Link](1);

FindAsync: Parametre olarak verilen birincil anahtar değerlerine sahip bir


varlığı bulmak için asenkron bir yöntemdir.
SaveChanges: Ekleme, silme ve değiştirme (Add,Remove,Update) işlemi
yapılmış varlıklar henüz veri tabanına kaydedilmemiştir. Bu durumdaki varlıklar
için veri tabanına INSERT, UPDATE veya DELETE komutunu çalıştırır.
SaveChangesAsync: Asenkron olarak kullanılan işlemlerde SaveChanges()
ile aynı işlemi gerçekleştirir.
using [Link];
using System;
using [Link];
using [Link];
using [Link];

namespace [Link]
{
public class KitaplikContext: DbContext
{
public DbSet<Kitap> Kitaplar { get; set; }
public DbSet<Yazar> Yazarlar { get; set; }

protected override void OnConfiguring(DbContextOptionsBuilder


optionsBuilder)
{
[Link](@”Server=(localdb)\mssqllocaldb;
Database=Kitaplik;Trusted_Connection=True;”);
}
}
}
DbContext’i uygulamamızda kullanabilmek için, bağlam (contex)
sınıfı olarak da bilinen DbContext’ten türetilen sınıfı oluşturmamız gerekir.
DbContext sınıfından türetilen yukarıdaki KitaplikContext sınıfı, Kitap ve Yazar
türü için veri tabanındaki Kitaplar ve Yazarlar tablolarına eşlenecek olan iki
DbSet<TEntity> özelliği içerir. OnConfiguring() yönteminde, hangi veri tabanının
kullanılacağını belirtmek için bir DbContextOptionsBuilder örneği kullanılır.

191
DbContextOptionsBuilder üzerinde UseSqlServer metodu ile MS SQL Server
sağlayıcısına bağlantı kurulmuştur.
Her DbContext örneği, yalnızca bir veri tabanı sağlayıcısı kullanacak şekilde
yapılandırılmalıdır. Bu Use* yöntemleri, veri tabanı sağlayıcısı tarafından
uygulanan uzantı(extension) metotlardır. Bu uzantı yönteminin kullanılabilmesi
için veri tabanı sağlayıcısı paketinin yüklenmiş olması gerekir. Yukarıdaki örnek
için
.UseSqlServer(connectionString) è için [Link].
SqlServer paketi yüklü olmalır.
Connection String (Bağlantı dizeleri), bağlanılan/ bağlanmakta olan veri
kaynağı hakkında bilgi içerir. Bu bilgi sağlayıcıdan sağlayıcıya değişir, ancak
genellikle kaynağın adını, konumunu ve isteğe bağlı olarak kullanıcının kimliğini
doğrulamanın bazı yollarını içerir.
@ ” S e r ve r = ( l o c a l d b ) \ m s s q l l o c a l d b; D a t ab a s e = K i t ap l i k ;Tr u s te d _
Connection=True; ifadesinde UseSqlServer sağlayıcısı için veri tabanı bilgileri
sağlanır: Burada Server ile kullanılacak DB sunucusu belirtilir. Database,
oluşturulacak veri tabanının adını belirtmek için kullanılır. Trusted_
Connection=True ifadesi ile de sunucuya bağlanırken windows kimlik doğrulama
modu ile bu işlemin yapılacağı belirtilmiştir Yukarıda connection string, SQL
Server Express Database Engine’in hafif bir sürümü olan SQL Server LocalDB’yi
belirtmektedir. Eğer makinenizde ayrı çalışan SQL Server sürümü varsa aşağıdaki
şekilde tanımla yapılabilir.
@”Server=.\;Database=Kitaplik;Trusted_Connection=True;

Yukarıdaki tanımlama ile DbContext’te direk kullanılan connection stringler


ile bir yapı oluşturulmuştur. Bundan başka Connection Stringler yapılandırma
dosyalarında tutulabileceği gibi, farklı yapılandırma ayarlarının kullanılmasına
izin veren özelliklerle de kullanılabilir (dependency injection kullanarak
yapılandırma vb.).

9.6.3. Migration Oluşturma


Code first yaklaşımı ile model ilk oluşturulduğunda veri tabanı ile modelin
senkron edilmesi gerekir. Aynı zamanda uygulamalar geliştirilmeye devam
ettikçe yeni gereksinimler ve güncellemeler ile birlikte modelin sık sık değişmesi
muhtemeldir. Veri tabanının modelle senkronize tutulması gerekir. Migration
özelliği ile, modelimizin o anki durumu veri tabanı ile senkron edilir. Veri tabanı
olmadığında, ilk migration oluşturulduğunda KitaplikContext’te DbSet özellikleri
tarafından temsil edilen Kitaplar ve Yazarlar için tablolar eklenecektir.
Bunun için Visual Studio’da,
Tools>>Nugget Package Manager>> Packages Manager Console (Araçlar ->
NuGet Paket Yöneticisi -> Paket Yöneticisi Konsolu) açılır.

192
WEB PROGRAMLAMA 2

Görsel 64. Packege Manager Console’un Açılması

Açılan konsolda Add-Migration “Migration Adı” şeklinde bir kod çalıştırılır.


Aşağıda bu migration adı olarak “ilk” kullanılmıştır:

Görsel 65. Packege Manager Console Ekranı

Bu kod çalıştırıldığında modele ait tüm özelliklerin anlık görüntüsü


niteliğinde (model ve modele ait özellikleri barındıran) ZamanDamgasi_ilk.cs
dosyası Migrations adlı yeni bir klasör ile beraber projeye eklenir.

193
Görsel 66. Oluşan Migration klasörü

Add-migration ile oluşan dosya içeriği incelendiğinde, modele ait yapının


SQL Server için bir çevrim niteliğinde olduğu görülebilir. Migration işlemini
yürütmek için Package Manager Console Ekranı’nda Update-Database komutu
çalıştırılmalıdır. Bu kod çalıştırıldığında SQL Server LocalDB’de Kitaplik isminde
bir veri tabanı ve bu veri tabanı içiresinde Kitaplar ve Yazarlar tabloları modele
uygun olarak oluşturulacaktır. Bu veri tabanı ve veri tabanına ait içeriği görmek
için View >> SQL Server Object Explorer seçilir.

Görsel 67. SQL Server LocalDB’yi Açma İşlemi

194
WEB PROGRAMLAMA 2

Oluşturduğumuz veri tabanımız Görsel [Link] gibi görünecektir.

Görsel 68. Kitaplik Veri Tabanı

Yazarlar ve Kitaplar tablolarını Görsel [Link] gösterdiğimiz örnek veriler ile


dolduralım. Bunun için tabloların üstüne sağ tıklayıp View Data seçeneği ile
“tablolar”daki veriler düzenlenebilir.

Görsel 69. Tablo verileri düzenleme

195
Projemizde ilk olarak, projemizin menülerini ve açılış sayfasını ayarlayalım.
Shared klasörü altındaki _Layout.cshtml dosyasında projemize ait menü kısmını
aşağıdaki kodlarla değiştirelim.
<nav class=”[Link] [Link]-expand-sm [Link]-toggleable-sm [Link]-light
bg-white border-bottom box-shadow mb-3”>
<div class=”container”>
<a class=”[Link]-brand” asp-area=”” asp-controller=”Home” asp-
action=”Index”>AUZEF</a>
<button class=”[Link]-toggler” type=”button” data-toggle=”collapse” data-
target= “.[Link]-collapse” aria-controls=”[Link]”
aria-expanded=”false” aria-label=”Toggle navigation”>
<span class=”[Link]-toggler-icon”></span>
</button>
<div class=”[Link]-collapse collapse d-sm-inline-flex justify-content-
between”>
<ul class=”[Link]-nav flex-grow-1”>
<li class=”nav-item”>
<a class=”nav-link text-dark” asp-area=”” asp-controller=”Yazar” asp-
action=”Index”>
Yazarlar
</a>
</li>
<li class=”nav-item”>
<a class=”nav-link text-dark” asp-area=”” asp-controller=”Kitap” asp-
action=”Index”>
Kitaplar
</a>
</li>
</ul>
</div>
</div>
</nav>
Projemiz çalıştırıldığında varsayılan olarak HomeController index action
metodu ile başlayacak bununla alakalı bir değişiklik yapmadık. Bu da bildiğimiz
gibi Home klasörü altındaki [Link] dosyasının proje başlangıcında
gösterilmesi demek. Bu dosyasının içeriğini de aşağıdaki gibi güncelleyelim:
@{
ViewData[“Title”] = “Ana Sayfa”;
}

<div class=”row”>
<div class=”col-md-4”>

196
WEB PROGRAMLAMA 2

<h2>Kitaplık Uygulaması</h2>
<p>
Kitaplık uygulaması
Entity Framework Core ile
[Link] Core MVC Web Uyglaması geliştirilmiştir.
</p>
</div>
<div class=”col-md-4”>
<h2>Yazarlar</h2>
<p>Yazarlar bölümünde yazarlar ekleyip, düzenleyebilirsiniz.</p>
</div>
<div class=”col-md-4”>
<h2>Kitaplar</h2>
<p>Kitaplar bölümünde kitaplar ekleyip, düzenleyebilirsiniz.</p>
</div>
</div>

Projemizin görünümü Görsel [Link] gibi olacaktır.

Görsel 70. Kitaplık projemizin görünümü

Şimdi var olan modelimiz çerçevesinde veri tabanı tablolarımızı kullanalım.


İlk olarak Yazarlar için manuel olarak kendimiz kodu oluşturalım. Daha
sonra Kitaplar için bu işlemi EF Core’a otomotik olarak yaptıralım. İlk olarak
YazarController isminde boş bir controller oluşturalım. Bu controllerın kodlarını
Index action metodu ile beraber aşağıdaki gibi güncelleyelim.

197
using [Link];
using [Link];
using System;
using [Link];
using [Link];
using [Link];

namespace [Link]
{
public class YazarController : Controller
{
private KitaplikContext k = new KitaplikContext();
public IActionResult Index()
{

var m=[Link]();
return View(m);

}
}
}
Burada KitaplikContext tipinde bir k nesnesi oluşturulmuştur. Bu k nesnesi
ile modelimiz ile ilintili veri tabanımız tablolarına ait verilere ulaşabilmekteyiz.
Örneğin m=[Link](); ile yazarlar tablosundaki tüm kayıtlar (tabloda
yer alan her bir kayıt yazar nesnesine karşılık gelir) m değişkenine aktarılmıştır.
Burada m yazar tablosundaki kayıt sayısı kadar yazar tutan bir değişkendir.
Tablodaki tüm kayıtlar alınarak, alınan model index view’ine gönderilmektedir.
NOT: DbSet sınıfı, IQuerayable’dan türetilmiş olduğundan DbSet varlıkları
üzerinde LINQ kullanılabilir. LINQ konusunda gördüğümüz gibi sorgular, sorgu
söz dizimi veya yöntem söz dizimi kullanılarak yazılabilir. Kullandığınız EF
Core sağlayıcısı, LINQ sorgusunu veri tabanında yürütülecek SQL’e çevirmekten
sorumludur. Örneğin yukarıdaki Index metodunda LINQ kullanarak sadece
YazarID’si 1 olan yazara ait veriler getirilmek istendiğinde, aşağıdaki kod
ile bu sağlanmış olur (Burada sadece YazarID’si 1 olan yazar index view’ine
gönderilmektedir):
public IActionResult Index()
{

var m = from yazar in [Link]


where [Link] == 1
select yazar;

198
WEB PROGRAMLAMA 2

return View(m);
}
Şimdi buradaki Index action metot üzerine sağ tıklayıp Add View (View Ekle)
seçeneği ile gelen sayfada Razor View bölümünü seçelim. Son olarak da Template
kısmını List, Model class kısmını Yazar ve Context class kısmını da KitaplikContext
olarak seçip Ekle butonu ile view’imizi ekleyelim.

Görsel 71. Yazar Index view’ine ait template, model ve context seçimi

Yazar klasörü altında [Link] dosyası içeriği aşağıdaki gibi olacaktır:


@model IEnumerable<[Link]>

@{
ViewData[“Title”] = “Index”;
}

<h1>Index</h1>

<p>
<a asp-action=”Create”>Create New</a>
</p>
<table class=”table”>
<thead>
<tr>
<th>

199
@[Link](model => [Link])
</th>
<th>
@[Link](model => [Link])
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model) {
<tr>
<td>
@[Link](modelItem => [Link])
</td>
<td>
@[Link](modelItem => [Link])
</td>
<td>
<a asp-action=”Edit” asp-route-id=”@[Link]”>Edit</a> |
<a asp-action=”Details” asp-route-id=”@[Link]”>Details</a> |
<a asp-action=”Delete” asp-route-id=”@[Link]”>Delete</a>
</td>
</tr>
}
</tbody>
</table>

Burada her bir yazar için foreach döngüsü ile bilgiler alınarak ekrana
basılmıştır. İstendiği takdirde tabloda hiçbir yazar olmaması durumunda, buraya
bir if kontrolu ile istenen uyarı mesajı verilebilir. Tabloda iki yazar datasının yer
aldığı bir durum için tüm yazarlar index view’ine gönderildiğinde Görsel [Link]
benzer bir görünümle karşılaşılacaktır.

200
WEB PROGRAMLAMA 2

Görsel 72. Yazarlar Tablosundaki Kayıtlar Listeleniyor

Yukarıdaki kodda <a asp-action=”Create”>Create</a> kısmını <a


asp-action=”Create”>Yeni Yazar Ekle</a> şeklinde güncelleyelim. Bu tag helper
“Yeni Yazar Ekle” ifadesine tıklandığında Create action metoda git anlamı taşır.
Dolayısı ile YazarController’ında Create action metod’unu oluşturalım. Aynı
zamanda bu işlem için yukarıda anlatıldığı şekilde bir view oluşturalım (Bu
view’in template kısmı Create olacaktır)
[Link] dosyasında oluşan kod aşağıdadır.

@model [Link]

@{
ViewData[“Title”] = “Create”;
}

@if([Link] is not null)


{
<h1>@[Link]</h1>
}

<h4>Yazar Ekle</h4>
<hr />
<div class=”row”>
<div class=”col-md-4”>
<form asp-action=”Create”>

201
<div asp-validation-summary=”ModelOnly” class=”text-danger”></
div>
<div class=”form-group”>
<label asp-for=”YazarAd” class=”control-label”></label>
<input asp-for=”YazarAd” class=”form-control” />
<span asp-validation-for=”YazarAd” class=”text-danger”></span>
</div>
<div class=”form-group”>
<label asp-for=”YazarSoyad” class=”control-label”></label>
<input asp-for=”YazarSoyad” class=”form-control” />
<span asp-validation-for=”YazarSoyad” class=”text-danger”></
span>
</div>
<div class=”form-group”>
<input type=”submit” value=”Create” class=”btn btn-primary” />
</div>
</form>
</div>
</div>

<div>
<a asp-action=”Index”>Back to List</a>
</div>

@section Scripts {
@{await [Link](“_ValidationScriptsPartial”);}
}

Bu kodda yer alan tag helper ile tanımlanmış form gönderildiğinde aynı
controller altında (YazarController) Create action metoduna post edilecektir
(asp-action=”Create”). Dolayısı ile bu post datasını karşılayacak Create adında
yazar tipinde bir modeli parametre alacak bir metot yazmak da gereklidir (Dikkat
edilirse iki tane Create action metodu olacaktır - aşırı yükleme). Bu metot sadece
post işlemi varsa çalışacaktır.
using [Link];
using [Link];
using [Link];
using System;
using [Link];
using [Link];
using [Link];

202
WEB PROGRAMLAMA 2

namespace [Link]
{
public class YazarController : Controller
{
private KitaplikContext k = new KitaplikContext();
public IActionResult Index()
{
var m=[Link]();
return View(m);
}
public IActionResult Create()
{
return View();
}
[HttpPost]
public IActionResult Create(Yazar y)
{
if ([Link])
{
[Link](y);
[Link]();
return RedirectToAction(“Index”);

}
else
{
[Link] = “Hata !!! Kayıt Eklenemedi”;
return View(y);
}

}
}
}

Yukarıda ki kodlarda görüldüğü gibi gelen model verisinin doğruluğu


sunucu taraflı olarak kontrol edilmiş, bu kontrolden geçtiği takdirde tabloya
kayıt ekleme işlemi gerçekleştirilmiştir. Burada [Link](y); kodu ile eklenen veri
k nesnesi için ekli olsa da (bellek üzerinde) henüz veri tabanında ilgili tabloya
kayıtlı değildir. [Link](); kodu ile tabloya kayıt tamamlanır. return
RedirectToAction(“Index”); kodu ile de index action metoduna yönlendirme
yapılarak tekrardan tüm yazar kayıtlarının listelenmesi sağlanmış olur (Eklenen

203
kayıt da bu listede yer almış olur). Model geçerli değilse [Link] ile hata
mesajı ilgili create view’inde kullanıcıya gösterilebilir.
Görsel [Link] her bir yazar için ayrıntı gösteren Details linkini karşılayan
YazarController da aşağıdaki gibi bir action metot oluşturalım.
public IActionResult Details(int? id)
{
if (id == null)
{
return NotFound();
}
var yazar = [Link](k=>[Link]).FirstOrDefault(x => [Link]
== id);

if (yazar == null)
{
return NotFound();
}
return View(yazar);
}
Yukarıdaki kodda include metodu ile sonuç kümesine dâhil edilmek istenen
gezinme özelliği (navigasyon properties) iletilir. Bu sorgu ile id ile filtreleme
yapılan yazarlara ait kitaplar da alınacaktır. (NOT: include metodu için using
[Link]; namapace’i ekli olmalıdır.) Details action
metot üzerine sağ tıklayıp Add View (View Ekle) seçeneği ile gelen sayfada Razor
View bölümünü seçelim. Template kısmını Details, Model class kısmını Yazar ve
Context class kısmını da KitaplikContext olarak seçip Ekle butonu ile view’imizi
oluşturalım.
@model [Link]

@{
ViewData[“Title”] = “Details”;
}

<div>
<h4>Yazar Bilgileri</h4>
<hr />
<dl class=”row”>
<dt class=”col-sm-2”>
@[Link](model => [Link])
</dt>
<dd class=”col-sm-10”>
@[Link](model => [Link])

204
WEB PROGRAMLAMA 2

</dd>
<dt class=”col-sm-2”>
@[Link](model => [Link])
</dt>
<dd class=”col-sm-10”>
@[Link](model => [Link])
</dd>
</dl>
</div>
@if ([Link] > 0)
{
<h4>Yazara Ait Veri tabanında Kayıtlı Kitaplar Aşağıdadır</h4>
<hr />
<ul>
@foreach (var item in [Link])
{
<li>@[Link]</li>
}
</ul>
}
<br />
<div>
<a asp-action=”Edit” asp-route-id=”@[Link]”>Edit</a> |
<a asp-action=”Index”>Back to List</a>
</div>
Otomatik olarak oluşturulan view’de yukarıdaki sarı renkle işaretli kod
bloğunu eklediğimizde ilgili yazara ait kitapları da listelemiş oluruz. Bu kod
bloğunda [Link] > 0 ile yazara ait kayıtlı kitap olup olmadığı
kontrol edilmekte, eğer kitap ya da kitaplar varsa bir döngü içerisinde kitaplar
ekrana basılmaktadır.

205
Görsel 73. Detay view’inde yazara ait kitaplar da listeleniyor

Tüm bu işlemleri şimdi Kitaplar modeli için, scaffolding olarak adlandırılan


CRUD action yöntem ve viewler’inin otomatik olarak oluşturulması sağlanacaktır.
Bunun için Solution Explorer’da Controllers klasörüne sağ tıklanarak ve Add >
New Scaffolded Item ögesi seçilir Görsel [Link] Entity Framework kullanarak
görünümleri olan MVC denetleyicisi seçildikten sonra Entity Framework
kullanarak görünümleri olan MVC Denetleyicisi Ekle iletişim kutusu görüntülenir.

206
WEB PROGRAMLAMA 2

Görsel 74. Entity Framework kullanarak görünümleri olan MVC


denetleyicisi seçimi

Burada model sınıfı ve contex sınıfı seçilir. Biz Kitap modeli için işlem yapmak
istediğimizden model olarak Kitap, contex sınıfı olarak da KitaplikContext
sınıflarını seçtik.

Görsel 75. Scaffolding için model ve context sınıfı seçimi

207
Ekle dediğimizde KitapController ve bu controller altında CRUD işlemleri için
tüm action metotlar aynı zamanda yine CRUD işlemleri için tim viewler (Index.
cshtml, [Link], [Link], [Link],[Link] ) otomatik
olarak oluşturulur.
KitapController Dependency Injection kullanarak Constructor’da sınıf
nesnesinin parametre olarak nasıl alınacağını izin veren bir yapıda otomatik
olarak oluşturulmuştur. Biz bu işlem yerine kendi oluşturduğumuz private
KitaplikContext _context = new KitaplikContext(); şeklinde düzenleme yaptığımız
KitapController’a ait kod aşağıda yer almaktadır:
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];

namespace [Link]
{
public class KitapController : Controller
{
/*
private readonly KitaplikContext _context;

public KitapController(KitaplikContext context)


{
_context = context;
}
*/

// Yukarıdaki kod bloğu aşağıdaki tek satırlık kod ile değiştirildi

private KitaplikContext _context = new KitaplikContext();

// GET: Kitap
public async Task<IActionResult> Index()
{
var kitaplikContext = _context.[Link](k => [Link]);
return View(await [Link]());
}

208
WEB PROGRAMLAMA 2

// GET: Kitap/Details/5
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();

var kitap = await _context.Kitaplar


.Include(k => [Link])
.FirstOrDefaultAsync(m => [Link] == id);
if (kitap == null)
{
return NotFound();
}

return View(kitap);
}

// GET: Kitap/Create
public IActionResult Create()
{
ViewData[“YazarID”] = new SelectList(_context.Yazarlar, “YazarID”,
“YazarAd”);
return View();
}

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind(“KitapID,KtapAdi,YazarID”)]
Kitap kitap)
{
if ([Link])
{
_context.Add(kitap);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
ViewData[“YazarID”] = new SelectList(_context.Yazarlar, “YazarID”,
“YazarAd”, [Link]);
return View(kitap);

209
}

// GET: Kitap/Edit/5
public async Task<IActionResult> Edit(int? id)
{
if (id == null)
{
return NotFound();
}

var kitap = await _context.[Link](id);


if (kitap == null)
{
return NotFound();
}
ViewData[“YazarID”] = new SelectList(_context.Yazarlar, “YazarID”,
“YazarAd”, [Link]);
return View(kitap);
}

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id,
[Bind(“KitapID,KtapAdi,YazarID”)] Kitap kitap)
{
if (id != [Link])
{
return NotFound();
}

if ([Link])
{
try
{
_context.Update(kitap); // Update işlemi gerçeklei
await _context.SaveChangesAsync(); // Update işlemi tabloya
uygulandı

}
catch (DbUpdateConcurrencyException)
{
if (!KitapExists([Link]))

210
WEB PROGRAMLAMA 2

{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction(nameof(Index));
}
ViewData[“YazarID”] = new SelectList(_context.Yazarlar, “YazarID”,
“YazarAd”, [Link]);
return View(kitap);
}

// GET: Kitap/Delete/5
public async Task<IActionResult> Delete(int? id)
{
if (id == null)
{
return NotFound();
}

var kitap = await _context.Kitaplar


.Include(k => [Link])
.FirstOrDefaultAsync(m => [Link] == id);
if (kitap == null)
{
return NotFound();
}

return View(kitap);
}

// POST: Kitap/Delete/5
[HttpPost, ActionName(“Delete”)]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
var kitap = await _context.[Link](id);
_context.[Link](kitap);
await _context.SaveChangesAsync();

211
return RedirectToAction(nameof(Index));
}

private bool KitapExists(int id)


{
return _context.[Link](e => [Link] == id);
}
}
}

Views >> Kitap klasörü altında [Link] , [Link] , [Link] ,


[Link] ve [Link] dosyaları da oluşturulmuştur. İstenirse bu dosyalarda
düzenlemeler yapılabilir.

Görsel 76. Veri tabanından çekilen kitapların listelenmesi


(KitapController =>Index action)

212
WEB PROGRAMLAMA 2

Görsel 77. Listede Delete ile silmek için seçilen kitaba ait onay ekranı
(KitapController =>Delete Action)

Web uygulamaları aynı anda normal olarak tek bir isteği işlemektedir. Ağ
gecikmesi, depolama sistem performansı, uzun istek kuyrukları vb. durumlarda,
bunlar web sunucusu tarafından eş zamanlı (Senkron) olarak yürütüldüğünde
performans üzerinde ciddi kayıplar meydana gelebilir. Dikkat edilirse aşağıdaki
kodda yer aldığı gibi içinde async ve await geçen action metotlar vardır. Bu
kodlama [Link] Core ve Entity Framework Core için varsayılan moddur ve ASP.
NET Core özellikleri kullanılarak controller action’ları Asenkron (eş zamansız)
hale getirilmiştir. Böylece bir isteğe cevap gelmeden diğer istekler de işletilmiş
olur. Özellikle yüksek trafik durumlarında performans iyileştirmesi sağlar.
public async Task<IActionResult> Index()
{
var kitaplikContext = _context.[Link](k => [Link]);
return View(await [Link]());
}
Yalnızca async anahtar sözcüğünü kullanmak, yönteminizi asenkron yapmaz,
tam tersi, bu yöntem hala senkrondur. Wait anahtar sözcüğü, asenkron bir bekleme
gerçekleştirir. Yaptığı ilk şey, işlemin zaten tamamlanmış olup olmadığını kontrol
etmektir. Eğer öyleyse, yöntemin yürütülmesine senkron olarak devam eder. Aksi
takdirde, wait anahtar sözcüğü asenkron yöntemin yürütülmesini duraklatacak
ve tamamlanmamış bir görev döndürecektir. İşlem tamamlandıktan sonra, birkaç
saniye sonra, asenkron yöntemi yürütmeye devam edebilir.

213
9.6.4. Model Güncelleme
Artan ihtiyaçlar ve çeşitli bakım sebepleriyle çoğu uygulamada güncelleme
yapmak kaçınılmazdır. Modellerimize yeni özellikler eklemek, yeni varlıklar
eklemek, bazı sınıfları kaldırmak vb. durumların zamanla oluşması muhtemeldir.
Örneğin yukarıda tanımladığımız Kitap sınıfında KitapSayfasi isminde bir özellik
eklemek isteyelim. Bunun için Model üzerinde gerekli düzenleme yapılır.
public class Kitap
{
public int KitapID { get; set; }
[Required]
[MaxLength(100)]
[Display(Name =”Kitap Adı”)]
public string KtapAdi{ get; set; }

[Display(Name =”Kitap Sayfa Sayısı”)]


[Range(10,5000)]
public int KtapSayfasi{ get; set; }

public int YazarID { get; set; }


public Yazar Yazar { get; set; }
}
Varlıklarınızı değiştirdikten sonra, EF Core’un veri modelinizin temsilini
güncellemeniz gerekir. Bunu için ilk migration oluştururken yaptığımız gibi
Packege Manager Console Ekranında Add-Migration “Migration Adı” şeklinde
bir kod ile gerçekleştiririz. Burada “Migration Adı” kısmına yapılan değişikliği
anımsatan bir ad vermek, daha sonra değişiklik geri alınması gibi bir durum
oluşursa durumu hatırlamak bakımından önemlidir. Görsel [Link] Add-Migration
KitapSayfasiEkleme ile Kitap sınıfına eklenen özelliğe ait EF Core bağlantı işlemi
tanımlanmıştır.

Görsel 78. Kitap sınıfına eklenen yeni özelliğin EF Core’da


güncellenmesi

Oluşan değişiklikleri Update-Database komutu ile veri tabanına


uyguladığımızda veri tabanına ilgili değişikliğin yansıdığı görülecektir.

214
WEB PROGRAMLAMA 2

Sınıfınızı çeşitli nedenler ile güncellediğimizi ve güncellemeleri ve add-


migration ve Update-Database komutları ile migration’ları veri tabanına
uyguladığınızı varsayalım. Veri tabanını önceki durumuna döndürmek
istendiğinde. Update-Database <Migration Adı> komutunu kullanılır. Yapılan bu
işlem ile önceden modele bağlı olarak scaffolding ile CRUD işlemleri için otomatik
olarak oluşturulan view’lere ([Link], [Link], [Link], Delete.
cshtml,[Link] ) yansımayacaktır. Bu yeni özellik ya bunlara manuel
olarak eklenir ya da scaffolding ile yapı yeniden oluşturulur.

215
Bu Bölümde Ne Öğrendik?

* ORM’ler, veri tabanı sistemlerinin nesne yönelimli programlama tekniklerine ait paradigmalar ile birlikte
kullanılması ihtiyacı üzerine ortaya çıkmıştır.

* ORM’ler sınıflar ve nesneler gibi nesne yönelimli programlama kavramlarının; tablolar ve


sütunlar gibi veri tabanı kavramlarıyla eşleşme yaparak kullanıma olanak sağlayan bir yapıdır.

* .Net Core’da yaygın bir ORM aracı olan Entity Framework Core’da veri tabanı işlemleri için Code First
(tercih edilen) ve Database First yaklaşımları kullanılmaktadır. Projede kullanılacak veri tabanına uygun
şekilde ilgili EF Core paketinin NuGet paket yöneticisi ile projeye eklenmesi gerekmektedir.

* EF Core’u yapılandırmak, yönetmek, çalışma zamanında veri tabanına erişmek vb. için
uygulamalarda veri tabanı ile veri modelleri arasındaki koordinasyonu sağlayan sınıf olan
DbContext kullanılır.

* Migration özelliği ile; code first yaklaşımında model ilk oluşturulduğunda veri tabanı ile modelin senkron
edilmesi sağlanabilmekte, yeni gereksinimler ile modele ait düzenleme yapıldığında modele uygun veri
tabanı güncelleme işlemi de gerçekleştirilebilmektedir.

216
WEB PROGRAMLAMA 2

Kaynakça
[Link] [Link]
lational-mapping-3255fa26d51f mework-core/

[Link] [Link]
h-async-and-await-in-asp-net-core/
[Link]
[Link]
[Link]
93relational_mapping_software
[Link]

217
Bölüm Soruları
1) Aşağıdakilerden hangisi .Net Core için bir ORM aracıdır?
a) Eloquent
b) Django ORM
c) Php
d) EF Core
e) Python

2) EF Core kullanılan bir bir [Link] Core projesinde oluşturulan bir sınıf
(class) veri tabanında hangi ögeye karşılık gelir?
a) Veri tabanı
b) Tablo
c) Fonksiyon
d) Özellik
e) Yukarıdakilerin hiçbiri

3) [Link] Core projesinde Mysql kullanmak için hangi paket yüklenmelidir?


a) [Link]
b) [Link]
c) EntityFrameworkCore.SqlServerCompact40
d) [Link]
e) [Link]

4) Bir model içindeki aşağıdaki özelliklerden hangisi varsayılan olarak


primary key olarak tanımlanır?
a) public int OgrKey { get; set; }
b) public int OgrPrimary { get; set; }
c) public int PrimaryKey { get; set; }
d) public int OgrId { get; set; }
e) public int Key { get; set; }

5) EF Core’da tercih edilen yaklaşım aşağıdakilerden hangisidir?


a) Database-First
b) First-Base
c) Key-First
d) Solution-First
e) Code-First

218
WEB PROGRAMLAMA 2

6) [Link] Core MVC’de migration işlemleri için hangi paket yüklenmelidir?


a) [Link]
b) [Link]
c) [Link]
d) [Link]
e) [Link]

7) EF Core ile Ogrenci sınıfına ait Ogrenciler tablosunun oluşturulması için


projede yer alan DbContext sınıfında nasıl bir tanım yapılmalıdır?
a) public DbSet<Ogrenci> Ogrenciler { get; set; }
b) public DbSet<Ogrenciler> Ogrenci { get; set; }
c) public Db<Ogrenci> Ogrenciler { get; set; }
d) public Db<Ogrenciler> Ogrenci { get; set; }
e) public Set<Ogrenciler> Ogrenci { get; set; }

var k = new KitapContext();


[Link](kitap);
[Link]();
8) Yukarıdaki kodun hatasız çalıştığı varsayıldığında veri tabanında hangi
işlem gerçekleşir?
a) Update
b) Read
c) Delete
d) Insert
e) Truncate

……1………
public int OgrNot { get; set; }
9) Code-First yaklaşımı ile oluşturulan projede OgrNot özelliğinin veri
tabanında oluşturmaması isteniyorsa ……1… ile ifade edilen yere ne
gelmelidir?
a) [Mapped]
b) [NotMapped]
c) [Key]
d) [Matched]
e) [NotMatched]

219
10) EF Core kullanılan bir bir [Link] Core projesinde oluşturulan bir sınıfa
(class) ait nesne veri tabanında hangi ögeye karşılık gelir?
a) Tablolara
b) Veri tabanlarına
c) Tablo kayıtlarına
d) Sorgulara
e) Yukarıdakilerin hiçbiri

Cevaplar
1-d 2-b 3-a 4-d 5-e 6-a 7-a 8-c 9-b 10-c

220
10. WEB API
Bilgi güçtür.
Francis Bacon

Ders videosunu izlemek için


QR kodu taratın.

Kazanımlar Birlikte Düşünelim


• API, Rest API kavramlarını bilebilir ve bu kavramlara neden
ihtiyaç duyulduğunu açıklayabilir. 1. API, Rest API kavramları neler-
• API’ler ile kullanılan veri formatlarını öğrenebilir. dir?
• Rest API tanımlamak için gerekli kısıtlar hakkında bilgi sahibi
olabilir. 2. RestFull API mimarisine ait
• HTTP istek-yanıt döngü yapısını ve HTTP durum kodlarını gerekli kısıtlar nelerdir?
bilebilir.
• Rest API’ler ile CRUD işlemlerini gerçekleştirebilir. 3. API’ler de sıklıkla kullanılan veri
formatları nelerdir?
Başlamadan Önce
Önceki bölümde [Link] Core uygulamalarında en sık kullanılan 4. HTTP yanıtlarını ait durum kod-
ORM araçlarından biri olan Entity Framework Core konusunu ele ları ve anlamları nedir?
almıştık. Bu bölümde ise Web API’leri üzerinde durulacaktır. Günümüz
teknoloji dünyasında bir organizasyonun gelişmesi ve başarılı olması 5. Rest API’ler ile CRUD işlemleri
için bilgiye zamanında erişim hayati önem taşımaktadır. Aynı zamanda nasıl ve hangi http metotları ile
geliştirilen sistemlerin hızlı ve yüksek performanslı yollarla iletişim gerçekleştirilir?
kurma, veri gönderme ve alma yeteneği önemli bir hal almıştır.

221
10.1. Web API
API (Application Programming Interface- Uygulama Programlama Arayüzü),
programcıların bir uygulamanın, işletim sisteminin veya diğer hizmetlerin belirli
özelliklerine veya verilerine erişmesine izin veren bir dizi işleve sahip bir tür
arayüzdür. Başka bir deyişle API, bilgi almak veya bir işlevi gerçekleştirmek için
bir bilgisayar veya sistemle etkileşim kurmak istendiğinde, isteği anlayıp yerine
getirebilmek için o sistemle iletişime yardımcı olur.
Web API, bir web sitesinin verilerini bir bilgisayar için anlaşılabilir hale getiren
araçtır. Bu sayede bir bilgisayar, tıpkı bir kişinin sayfaları yükleyerek ve formlar
göndererek yapabildiği gibi verileri görüntüleyebilir ve düzenleyebilir. Web
API’ler aracılığıyla bir uygulamanın, servisin ve/veya platformun sahip olduğu
yeteneklere farklı bir uygulamadan erişilebilir ve çeşitli işlemler gerçekleştirilebilir.
Bunu örneklendirecek olursak ilk etapta veri tabanıyla işlevsel olarak
etkileşime giren tamamen dinamik bir web uygulaması şeklinde projemize
başladığımızı varsayalım. Temel olarak kullanacağımız yapı Çizim [Link]
benzer olacaktır.

Çizim 10. Temel Web Uygulaması Yapısı

Zamanla ihtiyaçlar ve istekler dâhilinde web uygulamamızın yanına aynı


veri tabanını kullanan Android ve IOS uygulaması da eklediğimizi düşünelim.
Bu durumda üç farklı uygulamamız için ve bir veri tabanımız olacaktır. Bu üç
uygulamanın tümü, aşağıdaki Çizim [Link] gösterildiği gibi veri tabanı ile etkileşime
girecektir.

222
WEB PROGRAMLAMA 2

Çizim 10

Web Uygulaması

Veritabanı

Çizim 11. Farklı Uygulamaların Aynı Veri tabanını Kullanması

Yukarıdaki gibi üç farklı uygulama (uygulama sayısı artabilir) doğrudan veri


tabanıyla etkileşime giriyorsa kullanılan iş mantığı tüm uygulamalar için yazılmak
zorunda olduğundan kod tekrarı gerçekleşecektir. Aynı zamanda kodlama hataları
oluşma riski artacak ve herhangi bir değişiklik ya da iyileştirme durumunda aynı
değişiklik birçok yerde yapılmak zorunda olacaktır.
Bu durumda ara bir katman oluşturduğumuzu varsayalım. Bu ara katmanda
veri tabanı ile etkileşime geçen bir uygulama olsun. Diğer uygulamalar da bu
ara katmanda yer alan uygulama ile iletişime geçsinler. Bu durumda veri tabanı
işlemleri tüm uygulamalar için ortak, her birinin anlayabileceği bir biçimde ve tek
bir uygulama üzerinden gerçekleştirmiş olur. İşte burada veri tabanı ile etkileşime
geçen uygulama bir Web API olacaktır. Web API, HTTP Protokolü üzerinde çalışan
uygulamaların işlevselliğini genişletmek için kullanılan bir kavramdır.

223
Çizim 12

Web Uygulaması

Android Uygulaması Web API

IOS Uygulaması Veritabanı

Çizim 12. Web API’ler ile Farklı Uygulamalar İçin Entegrasyon

Bunun yanında bizim kontrolümüzde olan veri kaynağına bağlantı


sağlamak isteyen sadece bizim uygulamalarımız olmayabilir ya da biz başka veri
kaynaklarına bağlantı sağlamak isteyebiliriz. Bu gibi durumlarda kaynak verilerini
direk erişime açmadan; tarayıcılara, mobil cihaz uygulamalarına (kısaca farklı
platformlarda çalışan pek çok uygulamaya) hızlı ve basit bir şekilde bu verilerin
sunulması uygulamaların ortak bir dil konuşmasını sağlama fikri olan Web
API’ler ile gerçekleşir. Web API’ler ile farklı platform ve sistemdeki uygulamalar
ortak bir dil ile iletişim kurmuş olurlar.
2000’lerin başında, verilerin uzaktan entegrasyonu için önemli bir teknoloji
haline gelen API’lerin çoğu (En yaygın kullanılan iletişim ağı internet olduğundan),
Okuma Önerisi web standartlarına göre tasarlanmıştır. Tüm uzak API’ler web API olmasa da her
Tungut, B. ve Gökalp, G. (2016). web API aynı zamanda uzak API’dir.
[Link] Web API ve Mimari Özellik-
leri. İstanbul: Kodlab Yayınevi.
10.2. SOAP ve Rest Kavramları
Web API’ler yaygınlaştıkça, bilgi alışverişini standartlaştırmaya yardımcı
olmak için SAOP olarak bilinen Basit Nesne Erişim Protokol (Simple Object Access
Protocol) adlı bir protokol tanımlanmış ve geliştirilmiştir. SAOP ile tasarlanan
servisler, mesaj biçimleri için XML kullanır ve istekleri HTTP veya SMTP aracılığıyla
alır. SOAP, farklı ortamlarda çalışan veya farklı dillerde yazılmış uygulamaların
bilgi paylaşımını kolaylaştırır. SOAP servislerinin kullanım yöntemi uzaktan bir
servisin çağrılması (RPC-Remote Process Call) şeklindedir. Güvenlik protokollerini
içerisinde barındırır, durum bilgisini request ve response’larda saklar.
Web API kullanımında bir başka tanım Temsili Durum Aktarımıdır
(Representational State Transfer - REST). REST mimari kısıtlamalarına uyan Web

224
WEB PROGRAMLAMA 2

API’lerine RerstFull API’ler denir. REST bir mimari tarz iken, SOAP bir protokoldür.
Burada mimari tarz ile belirtilen önceden tanımlanmış ilkeleri olan bir kavramdır.
Bu durum, Restful web API’leri için resmi bir standart olmadığı anlamına gelir.
SOAP’da istemci bağlantı kuracağı servisle ilgili her şeyi bilmek zorundayken,
REST mimarisinde REST servisler bu servisin yapısını ve detayını bilmek zorunda
olmadan doğrudan bir URL çağırarak çalışır. Arada ek bir bileşen veya protokol
kullanılmaz. Bu sebeple daha esnek ve kullanımı daha kolaydır.
İlk olarak Roy Fielding’in “Mimari Stiller ve Ağ Tabanlı Yazılım Mimarilerinin
Tasarımı” adlı tezinde tanımlanmış, API’lerin RestFull API olabilmeleri için
aşağıda yer alan kısıtlamalara uymaları gerekmektedir.
• İstemci-Sunucu Mimarisi (Client-server architecture): REST mimarisinde
istekler http protokolü üzerinden gerçekleşir. İstemci ve sunucu uygulamaları
birbirinden tamamen bağımsız olmalıdır. İstemci uygulamasının bilmesi gereken
tek bilgi, istenen kaynağın URI’sidir. İstemci sunucu uygulamasıyla başka hiçbir
şekilde etkileşime giremez. Benzer şekilde, bir sunucu uygulaması, istemci
uygulamasını HTTP aracılığıyla istenen verilere iletmek dışında değiştirmemelidir.
• Tek Tip Arayüz (Uniform Interface) Aynı kaynak için tüm API istekleri,
isteğin nereden geldiğine bakılmaksızın aynı görünmelidir. Sistemdeki bir
kaynağın yalnızca bir mantıksal URI’si olmalıdır ve bu, ilgili veya ek verileri
getirmenin bir yolunu sağlamalıdır.
• Durumsuzluk(Stateless): İstekler arasında sunucu tarafında istemci ile
ilgili hiç bir bilgi tutulmadığı durumu ifade eder. Her istek birbirinden bağımsız
şekilde işletilir.
• Ön Bellekleme (Cacheable): Günümüz dünyasında, verilerin ve yanıtların
önbelleğe alınması son derece önemlidir. REST’te, uygun durumlarda kaynakların
önbelleğe alma durumu uygulanabilir olmalıdır. Ön belleğe alınabilme
durumunda kaynaklar kendilerini önbelleğe alınabilir ilan etmelidir. Önbelleğe
alma, bazı istemci-sunucu etkileşimlerine olan ihtiyacı ortadan kaldırabilir.
• Katmanlı Sistem (Layered System): İstemcinin sunucu yapısında hangi
katmanda ne yapıldığını bilmemesi ile ilgilidir. İstemci-sunucu etkileşimlerine ek
katmanlar aracılık edebilir. Bu katmanlar, yük dengeleme, paylaşılan önbellekler
veya güvenlik gibi ek özellikler sunabilir.
• İstek Üzerine Kod (Code on Demand): Bu kısıtlama isteğe bağlıdır. Çoğu
zaman, kaynaklar XML veya JSON biçiminde döndürülürken bazı durumlarda
sunucular, yürütülebilir kodu (executable script) istemciye aktararak istemcinin
işlevselliğini arttırabilir. Özetle sunucunun bazı durumlarda istemciye script
yollaması olarak tanımlanabilir.

10.3. API’ler için Veri Formatları


Genellikle istek mesajları için HTTP kullanan web API’ler yanıt mesajlarının
yapısının tanımını sağlarlar. Text ve csv gibi birçok farklı yapıda dönüş tipi
kullanılabilir olsa da yanıt mesajları genellikle farklı uygulama türleri için kolayca

225
anlaşılıp işlenebilen format olan XML ve JSON (JavaScript Object Notation)
biçimindedir. Web API’ler varsayılan olarak JSON ve XML verilerini işler.
JSON web üzerinde veri alışverişi için en yaygın kullanılan veri formatıdır.
Birçok API, JSON’u bir biçim olarak benimsemiştir. Tüm modern programlama
dilleri (Java, JavaScript, C#, PHP, Python vb.) ve uygulama platformları, JSON
verilerinin üretilmesi (serializing) ve tüketilmesi (unserializing) için desteğe
sahiptir.
JSON, anahtar (key) ve değer (value) şeklinde iki parçadan oluşan çok basit
bir format yapısına sahiptir. Anahtar-değer çifti, anahtarın ardından iki nokta üst
üste işareti ve ardından değerin geldiği belirli bir söz dizimi ile belirtilir ve bu
çiftler virgülle ayrılmıştır.
{
“Ad”: “Ömer”,
“Numara”: 100
“Durum”: 1
}
Yukarıdaki JSON örneğinde, anahtarlar soldaki kelimelerdir. (Ad, Numara ve
Durum) Sağda ise anahtarlara ait değerler yer alır.
XML (eXtensible Markum Language -Genişletilebilir İşaretleme Dili) JSON
gibi API’ler de verilerin yapılandırılması için de kullanılabilen bir veri formatıdır.
XML, html gibi bir işaretleme dilidir. Html’de yer alan etiketlerden farklı olarak
XML için etiketler dokümanı oluşturan kişiler tarafından belirlenip oluşturulur.
Etiketler oluşturulurken hiyerarşik bir yapıda oluşturulmalı, açılan etiketler
kapatılmalıdır. Ayrıca XML etiketleri büyük-küçük harf duyarlıdır ve etiketlere
nitelik atanabilir. Ana bloğa kök (node) denir ve XML dokümanları her zaman bir
kök düğümle başlar. Yukarıda yer alan JSON örneğinde kök düğümün “Ogrenci”
olduğunu varsayıldığında aşağıdaki şekilde bir xml formatı oluşturulabilir:
<Ogrenci>
<Ad>Ömer</Ad>
<Numara>100</ Numara >
<Durm>1</Durum>
</ Ogrenci >

Örnekten de görülebileceği gibi açıp kapanan her bir etiket (tag) arasında
o etikete ait değer yer almaktadır (örneğin Ad etiketi için tanımlı değer Ömer).
Aynı verinin gösterimi için JSON ve XML olarak formatlanan yukarıdaki örnekleri
incelediğimizde, XML biçiminde iletişim kurmak JSON’a nazaran daha fazla yan
bilgiye (metin) ihtiyacı da beraberinde getirir.

10.4. HTTP Protokolü ve Rest API


REST mimarisi http iletişim protokolünü kullanır ve bu protokolü standart
olarak benimsemiştir. Rest API kullanıldığında istek ve yanıtlar http protokolü

226
WEB PROGRAMLAMA 2

üzerinden gerçekleştiğinden, http istek ve yanıt döngüsüne ait birtakım bilgilerin


bilinmesi gerekmektedir.
İstek-yanıt döngüsü adı verilen bir kavram dâhilinde gerçekleşen http
protokolünde geçerli bir http isteği için istemcinin aşağıda yer alan dört ögeyi
içermesi gerekir.

Şekil 16. HT TP İstek ve Yanıt Döngüsüne Ait Bilgiler

• URL: Bir URL, web’de yer alan belirli bir benzersiz kaynağın adresidir.
Teoride, her geçerli URL benzersiz bir kaynağa işaret eder. API’ler, kaynak adı
verilen URL’ler ile çeşitli durumlar için istemcinin sunucuya etkileşim kurmasını
sağlarlar.
• Method-Verb: İstek yöntemi sunucuya, istemcinin sunucunun ne tür bir
işlem yapmasını istediğini söyler. Her istek bir HTTP metoduna sahip olmalıdır.
API’lerde en sık kullanılan dört yöntem Get, Put, Post ve Delete’tir. Bu yöntemler
ileride ayrıntılı olarak açıklanacaktır.
• Header(s) (Başlık): Bir http isteğinde header bilgisi istek veya yanıtla
ilgili bir bilgi listesidir. Header bölümünde verilerin hangi formatta olduğunu
söyleyen bir veri vardır. (Content-Type) İstemci bir istekte Content-Type başlığını
gönderdiğinde, sunucuya isteğin gövdesindeki verilerin belirli bir şekilde
biçimlendirildiğini söyler. İstemci sunucuya JSON verilerini göndermek isterse,
içerik türünü Content-Type “application/json” olarak ayarlayacaktır. Sunucu
isteği alıp içerik türünü değerlendirdikten sonra, sunucu tarafından verilerin
nasıl okuyacağı bilinecektir. Benzer şekilde, sunucu tarafından istemciye
gönderilen yanıtta, yanıtın gövdesini nasıl okuyacağını belirtmek için Content-
Type ayarlanacaktır. Sunucu belirtilen formattan başka bir şey geri gönderirse,
istem başarısız olur ve hata verir.

227
• Body (Gövde): İstek gövdesi, istemcinin sunucuya göndermek istediği
verileri içerir. Sunucuya gönderilmek istenen her istek, gönderilmek istenen
verileri içeren bir gövde verisine sahip olmalıdır. HTTP protokolü katı bir yapı
gerektirdiği metot, url ve header için katı bir sınırlama getirirken, body (gövde) ile
istemcinin ihtiyaç duyduğu her şeyi göndermesine izin verir.
Sunucu, istemciden bir istek aldıktan sonra, isteği yerine getirmeye ve
istemciye bir yanıt döndürmeye çalışır. HTTP yanıtları, HTTP isteklerine çok
benzer bir yapıya sahiptir. Temel fark, bir yöntem ve bir URL yerine, yanıtın bir
durum kodu içermesidir. HTTP yanıtı aşağıdaki bileşenleri içerir.
• HTTP Durum Kodları (HTTP Status Code): Her bir yanıt bir durum koduna
sahip olmalıdır.
• Yanıt Başlığı (Response Headers): Yanıtlarda bir veya daha fazla yanıt
başlığı olabilir.
• Veri (Data): İstemciye dönen veriyi belirtir.

10.5. HTTP Durum Kodları


Durum kodları, her birinin benzersiz bir anlamı olan üç basamaklı sayılardır.
Bu kodlar, sunucudan gelen yanıt hakkında bilgi içeren HTTP yanıtının önemli
bileşenlerinden biridir. Sunucudan istemciye gelen her bir yanıtta HTTP durum
kodu da yer alır. HTTP durum kodları aşağıda açıklamalı olarak verilen beş
kategoriye ayrılmıştır (Her bir kategori için sık kullanılan http durum kodları da
aşağıda açıklanmıştır):

• Bilgilendirici Yanıtlar: 100-199 arasında değerler alır. Tarayıcı tarafından


gönderilen isteğin sunucu tarafından alındığını, alınan isteğin de
işlenmekte olduğunu gösterir.
 100 - Devam: İstemci talebi işleniyor.
 101 - Protokol Değiştirme: İstemci protokol tipini değiştirmek istedi ve
sunucu kabul etti.
 102 - İşleme: İşleme normalden daha uzun sürüyor.

• Başarılı Yanıtlar: 200-299 arasında değerler alır. İstemci ve sunucu


tarafından gerçekleştirilen iletişimin başarılı bir şekilde tamamlandığını
belirtir.
 200 - Tamam: İstek ve yanıt başarılı bir şekilde gerçekleştirildi.
 201 - Oluşturuldu: Sunucuya gerçekleştirilen isteğin başarılı olması ile
sunucuda yeni bir kaynak oluşturuldu.
 202 - Kabul edildi: İstemci sunucuda bir şey oluşturmak istedi. Bu istek
sunucu tarafından kabul edildi, fakat henüz işletilmedi.
 204 - İçerik Yok: İstek alındı, ancak istemciye henüz hiçbir veri
gönderilmedi.

228
WEB PROGRAMLAMA 2

• Yönlendirme Mesajları: 300-399 arasında değerler alır. Erişilmek istenen


kaynağın başka bir adrese taşındığını ve bir yönlendirmenin söz konusu
olduğunu ifade eden durum kodlarıdır.
 301 - Kalıcı Olarak Taşındı: Bir kaynağın başka bir yere taşındığını
bildirir. İsteği başka bir kaynağa yönlendirilir.
 302 – Geçici Taşındı: Aranılan kaynağın geçici olarak verilen URL’ye
taşındığı anlamına gelir.

• İstemci Hata Yanıtları: 400-499 arasında değerler alır. Sunucu tarafından


alınan isteğin yerine getirilemediğini, istemde bulunulan web içeriğine
ulaşılamadığını ifade eden durum kodlarıdır.
 401 - İzinsiz: Erişimi olmayan kaynağa erişmeye çalışıldığını ifade
eder.
 404 - Bulunamadı: İstek yapılan kaynağın bulunamadığını belirtir. 404
sayfaya yönlendiren bağlantılara genellikle bozuk veya ölü bağlantılar
denir.
 403 - Yasak: İstekte bulunulan kaynağın yasaklandığını belirtir.
 408 - İstek Zaman Aşımı: belirli bir sürede isteğin tamamlanamadığını
belirtir.

• Sunucu Hata Yanıtları: 500-599 arasında değerler alır. İstemci tarafından


gönderilen isteğin başarıyla sunucuya ulaştığını fakat sunucuda sorunlar
nedeniyle isteğin yerine getirilemediğini ifade eden durum kodlarıdır.
 500 - Dahili Sunucu Hatası: Sunucuda bir hata oluştu ve istek sunucu
tarafından karşılanmadı.
 502 - Geçersiz Ağ Geçidi: Gateway veya Proxy sunucusu, kaynağın
bulunduğu sunucudan cevap alamadı.
 503 - Hizmet Kullanılamıyor: Sunucunun şuan hizmet veremediğini
belirtir.
 504 - Ağ Geçidi Zaman Aşımı: Gateway veya Proxy sunucusu, kaynağın
bulunduğu sunucudan belirli bir zaman içinde cevap alamadı.

10.6. HTTP Metodları ve CRUD İşlemleri


CRUD (Create, Read, Update, and Delete) – kalıcı depolama işlemleri için
kullanılan dört ana işlevdir. Birçok programlama dili ve protokolü, genellikle
bu fonksiyonların nasıl adlandırıldığı ve ne yaptıkları konusunda küçük
değişikliklerle birlikte, kendi CRUD eşdeğerine sahiptir. CRUD işlevlerinin her biri
için çeşitli farklı tanımlar olmasına rağmen, temel fikir, bir veri koleksiyonunda
aşağıdaki eşleşen işlemlerin gerçekleştirilmesidir.

229
Şekil 17. CRUD İşlevlerinin Temel Fikri

Web üzerinden sunulan REST API’lerinin doğası gereği, bu API’ler, GET,


POST, DELETE ve PUT gibi HTTP protokolüne ait metotlar kullanarak istemciler ile
iletişim kurar. Bu noktada, HTTP metotları ile CRUD işlevleri arasında bir örtüşme
tanımlanmıştır. Her Rest API, POST, GET, PUT, PATCH, DELETE gibi standart bir
HTTP istek metodu ile çağrılır. Dört ana HTTP metodu (GET, PUT, POST ve DELETE)
beraber PATCH metodu CRUD işlemleriyle aşağıdaki gibi eşleştirilmiştir:

Tablo 6. CRUD işlemlerinin SQL ifadeleri ve http Metotları ile eşlenmesi.

CRUD SQL http METOT


CREATE INSERT POST
READ SELECT GET
UPDATE UPDATE PUT/PATCH
DELETE DELETE DELETE

Kaynakları REST ortamında okumak-almak için GET metodu kullanılır.


Belirtilen kaynağın bir temsilini ister. GET metodu yalnızca veri istemek için
kullanılmalı (veri içermemelidir) var olan bilgiyi değiştirmek için kullanılmamalıdır.
Bu metot ile bir alana ait tüm veriler için istekte bulunulabileceği gibi (örneğin,
öğrencilerin listesini almak, ürün listesini almak vb.) özel olarak belirli bir değere
sahip veriler içinde (id ile bir öğrenci almak vb.) istekte bulunulabilir.
PUT http metodu, mevcut veri kaynağının tüm özelliklerini güncellemek
için kullanılır. Örneğin belirli bir ürüne ait (var olan bir ürün) tüm özellikler
güncellemek istiyorsak, PUT HTTP isteği kullanmamız gerekir.

230
WEB PROGRAMLAMA 2

PATCH http metodu mevcut bir kaynağın tüm özelliklerinin değil de bazı
özelliklerinin güncellenmek istendiği durumlarda kullanılır. PATCH yöntemi,
PUT yöntemine benzer, ancak veri kaynağındaki birkaç özelliği güncellemek
için kullanılır. Örneğin, ürün tablonuz 5 sütun içeriyorsa ve mevcut bir ürünün
yalnızca 2 sütununu güncellemek istiyorsanız, PATCH yöntemini kullanmanız
gerekir.
POST http metodu, uygulamada yeni kaynaklar oluşturmak için kullanılır.
Örneğin veri tabanına API ile yeni bir öğrenci eklediğimizi düşündüğümüzde
POST yöntemini kullanmanız gerekir. Eklenmek istenen veriler HTTP isteğinin
mesaj gövdesindedir.
DELETE http metodu belirtilen bir veya daha fazla kaynağı silmek için
kullanılır.
Web API’ler ile gerçekleştirilen tüm bu işlemler sonucunda işlemin gerçekleşme
durumuna göre http durum kodları ile sunucudan gelen yanıt hakkında bilgi sahibi
olunur. Örneğin Get metodu ile tüm veriler başarılı bir şekilde elde edildiğinde
durum kodu 200 (ok) olacaktır. Yine Get metodu ile tüm müşteriler elde edilmek
istendiğinde geçersiz bir istek ya da kaynağın bulunamaması durumunda 404
(Not Found) durum kodu dönecektir.
Tablo 10.2’de temel http metodlarının [Link] Core MVC’de oluşturulan
OgrenciController ismindeki bir ApiController’da CRUD işlem tanımlamaları
verilmiştir.

Tablo 7. [Link] Core MVC’de OgrenciController adlı bir Api


Controller’da CRUD işlem tanımlamaları

HTTP Method URI İşlem


GET [Link] Tüm öğrenci ögelerini getir
GET [Link] 10 numaralı kimlik bilgisine sahip öğrenci verisini
getir
DELETE [Link] Kimlik numarası 10 olan öğrenci kaydını sil
PUT [Link] 10 kimlik numaralı öğrenci kaydını güncelle (Gün-
celleme için veriler http isteğinin gövde kısmında)
POST [Link] Yeni bir öğrenci ekle (Öğrenci verileri http isteğinin
gövde kısmında)

10.7. [Link] Core Web API


API uygulamaları geliştirirken API’lerimizi mevcut MVC projeleri ile birlikte
oluşturup kullanabileceğimiz gibi, projeyi baştan yapılandırırken [Link] Core
Web API şeklinde bağımsız bir hizmet katmanı olarak da oluşturabiliriz. Burada
önceki bölümde EF Core ile oluşturduğumuz projemiz üzerinden API kullanımını
anlatmaya devam edeceğiz.

231
İlk olarak var olan bir Asp Net Core MVC projesinde bir API Controller
oluşturup bu Controller’ın yapısını inceleyelim. Bunun için normal Controller
ekleme adımlarını takip edip (Controller klasörüne sağ tıklayıp, Add Controller
seçeneği seçilir) MVC yerine API kısmını seçiyoruz.

Görsel 79-1.

Görsel 79-2. Hazır metotlar ile bir Api Controller oluşturma

Api Controleller’ımıza bir isim verdikten sonra Çizim [Link] yapılandırdığımız


Controller’ımızın varsayılan olarak tüm Get, Put, Post ve Delete yöntemleriyle
oluşturulduğunu görebiliriz.
using [Link];
using System;
using [Link];

232
WEB PROGRAMLAMA 2

using [Link];
using [Link];
namespace [Link]
{
[Route(“api/[controller]”)]
[ApiController]
public class ApiDenemeController : ControllerBase
{
// GET: api/<ApiDenemeController>
[HttpGet]
public IEnumerable<string> Get()
{
return new string[] { “value1”, “value2” };
}

// GET api/<ApiDenemeController>/5
[HttpGet(“{id}”)]
public string Get(int id)
{
return “value”;
}

// POST api/<ApiDenemeController>
[HttpPost]
public void Post([FromBody] string value)
{
}

// PUT api/<ApiDenemeController>/5
[HttpPut(“{id}”)]
public void Put(int id, [FromBody] string value)
{
}

// DELETE api/<ApiDenemeController>/5
[HttpDelete(“{id}”)]
public void Delete(int id)
{
}
}
}

233
API’leri test etmek için geliştiricilerin sıklıkla kullandığı popüler bir API
istemcisi olan Postman programından yararlanacağız ([Link]
com/downloads adresinden ücretsiz olarak kurulum yapılabilir).

[Route(“api/[controller]”)]
[ApiController]
public class ApiDenemeController : ControllerBase

Yukarıdaki kodlarda görüldüğü gibi oluşturulan ApiDenemeController,


varsayılan olarak ControllerBase sınıfından türetilmiştir (Controller sınıfını
view’leri desteklemek için gerekli olan bazı üyeleri içerir). Hem view’ler hem de web
API’leri için aynı controller kullanımı planlanıyorsa, oluşturulan Controller’lar,
Controller sınıfından türetilebilir. (Controller sınıfının yapısı incelendiğinde,
ControllerBase’den miras aldığı görülecektir.) Fakat API’ler için genel yaklaşım
API’lerin ayrı olarak çalışması yönünde olduğundan ControllerBase sınıfından
yapılan türetim daha uygundur.
[ApiController] öz niteliği Controller’ın web API isteklerine yanıt verdiğini
gösterir. Ayrıca, bu öz nitelik, [Link] Core için kullanıma hazır doğrulama ve
model bağlama sağlar. Bu da her action’da [Link] öz niteliğini açıkça
kontrol etmemize gerek olmadığı anlamına gelir. Model doğrulama hatalarının
otomatik olarak bir HTTP 400 yanıtını tetiklemesini de bu öz nitelik gerçekleştirir.
[Link] Core Web API uygulamalarında yönlendirme; gelen HTTP İsteğini
(URL) belirli bir kaynağa, yani controller ve action metoduna eşleme işlemidir.
Yönlendirme kavramı için genellikle her kaynak için bazı URL’ler belirlenir.
Uygulama çalıştırıldığında oluşan Route tablosunda URL ile kaynak arasındaki
eşleme bilgileri yer alır. İstemciden sunucuya gelen istek ile Route tablosundaki
URL kontrol edilir. Eğer eşleme varsa o zaman uygulama isteği eşleşen kaynağa
iletilir, aksi takdirde kaynak bulunamadı şeklinde bir hata üretilir. Route öz
niteliği, [Link] Core uygulamasında controller veya action metot seviyesinde
tanımlanabilir. Controller üzerinde tanımlanan Route öz niteliği varsayılan
Anahtar Kavram template olarak (“api/[controller]”) şablonunu kullanır. Burada [Controller] ile
Routing (Yönlendirme), gelen HTTP
isteklerini eşleştirmekten ve bu oluşturulan controller ismi yer değiştirilecek özel bir adlandırma kuralı sağlanır.
istekleri uygulamanın yürütülebilir Örneğin oluşturduğumuz ApiDenemeController’da, [Controller] tanımlaması ile
uç noktalarına göndermekten
çalışma zamanında ApiDeneme metniyle (controller’ın kendi adı) yer değiştirilir
sorumludur.
(örnek için [Route(“api/ApiDeneme”)] şekline çevirir). Bu örnek için HttpGet
isteği ile ilgili metot [Link] 44360/api/ApiDeneme şeklinde çağrılır
(Burada 444360 olan port numarası değişiklik gösterebilir), (UseRouting ve
UseEndpoints Startup sınıfının Configure yönteminde yapılandırılmış haldedir).
Bundan başka her bir action metot için ayrı ayrı tanımlanan vb. başka routing
yapıları da kullanılabilir.
ApiDenemeController ismi ile oluşturduğumuz Api Controller’ını Http Get
metodu ile çağıralım.

234
WEB PROGRAMLAMA 2

Görsel 80. Oluşturulan API’nin web tarayıcısında çağrılması

Bu API’yi http Get metodu ile bir de postman ile çağıralım.

Görsel 81. Oluşturulan API’nin Postman ile get metodu ile çağrılması

Yukarıda Postman ile Get isteği yaptığımıza dikkat ediniz. Url ise projemizde
yer alan API’ye aittir. Bu örnekte ApiDenemeController’da Get metodu çağrılmış

235
olur. [Link] Core MVC, yanıt verilerini biçimlendirme desteğine sahiptir. Yanıt
verileri, belirli biçimler kullanılarak veya istemcinin talep ettiği biçime yanıt
olarak biçimlendirilebilir. Burada istemcinin isteği doğrultusunda yanıt Json
formatında dönmüştür. API çağrıldığında otomatik olarak nesneyi saran bir
ObjectResult oluşturulur. İstemci, biçimlendirilmiş ve serileştirilmiş nesneyi alır.
Döndürülen nesne null ise, 204 içerik yok yanıtı döndürülür.
NOT: Bölüm boyunca API’lerin oluşturulması konusu tartışılmaktadır.
API’lerin çağrılması sonucu elde edilen Json ya da Xml verilerinin front-end
tarafında işlenip elde edilebileceği unutulmamalıdır.
Şimdi bir önceki bölümde EF Core - Code First yaklaşımı ile oluşturduğumuz
projemiz üzerinden Yazar verileri için bir API oluşturalım. Controller klasörüne
sağ tıklayıp, Add Controller seçeneği ile YazarApiController isminde boş bir API
Controller oluşturalım.

Görsel [Link] isiminde boş bir Api Controller


oluşturma

236
WEB PROGRAMLAMA 2

Görsel [Link] isiminde boş bir Api Controller


oluşturma

YazarApiController isminde oluşturduğumuz Controller’ımızın kodlarını


aşağıdaki şekilde güncelleyelim:

using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];

namespace [Link]
{
[Route(“api/[controller]”)]
[ApiController]
public class YazarApiController : ControllerBase
{
KitaplikContext k = new KitaplikContext();

// GET: api/<OgrenciController>
[HttpGet]
public List<Yazar> Get()

237
{
return [Link]();
}

// GET api/<OgrenciController>/5
[HttpGet(“{id}”)]
public Yazar Get(int id)
{
var y = [Link](x => [Link] == id);
return y;

// POST api/<OgrenciController>
[HttpPost]
public void Post([FromBody] Yazar y)
{
[Link](y);
[Link]();
}

// PUT api/<OgrenciController>/5
[HttpPut(“{id}”)]
public IActionResult Put(int id, [FromBody] Yazar y)
{
var y1 = [Link](x => [Link] == id);
if (y1 is null)
{
return NotFound();
}
else
{
[Link] = [Link];
[Link] = [Link];
[Link](y1);
[Link]();
return Ok();
}
}

// DELETE api/<OgrenciController>/5
[HttpDelete(“{id}”)]

238
WEB PROGRAMLAMA 2

public ActionResult Delete(int id)


{
var y1 = [Link](s => [Link] == id);
if (y1 is null)
{
return NotFound();
}
else
{
[Link](y1);
[Link]();
return Ok();

}
}
}

Şimdi projemizi çalıştırıp yazdığımız API’nin tüm metotlarını Postman


uygulaması ile test edelim.
İlk etapta Yazarlar tablosunda yer alan tüm kayıtları getirelim. Postman
ile projemizin çalıştığı [Link] adresinden Send
butonuna basarak http get metodu ile çağırdığımız web API’miz yazarlar
tablosunda yer alan 2 kaydı, Json formatında YazarApiController’daki Get() action
metot ile döndürmüştür.
[HttpGet]
public List<Yazar> Get()
{
return [Link]();
}

239
Görsel 83. Http Get Metodu ile istekte bulunan Api’ye ait yanıt -
Yazarlar tablosundaki tüm kayıtlar getiriliyor

Yazarlar tablosunda sadece istediğimiz kaydı getirelim. Postman ile http://


localhost:44360/api/Yazarapi/1 adresinden http get metodu ile çağırdığımız
web API’miz, yazarlar tablosunda YazarID’si 1 olan kaydı Json formatında
YazarApiController’daki Get(int id) action metodu ile döndürmüştür. Burada
[HttpGet(“{id}”)] ile [Link] Core’daki model bağlama sistemi URL’deki yer alan
değeri, Get(int id) yöntemindeki id parametresiyle otomatik olarak eşler.
[HttpGet(“{id}”)]
public Yazar Get(int id)
{
var y = [Link](x => [Link] == id);
return y;

240
WEB PROGRAMLAMA 2

}
Görsel 84. Http Get Metodu ile id’si 1 olan kayıt için istekte bulunan
Api’ye ait yanıt - Yazarlar tablosundaki YazarID si 1 olan kayıt
getiriliyor

URL’deki yer alan değer, Get(int id) yöntemindeki id parametresiyle


eşleşmiyorsa hata kodu olarak 204 döner. [Link]
adresine Http Get metodu ile istek gönderildiğinde YazarID’i 10 olan bir
kayıt Yazarlar tablosunda yer almadığından API yanıt olarak Görsel [Link]
görebileceğimiz 204- İçerik Yok hata kodunu vermiştir.

241
Görsel 85. Http Get Metodu ile id’si 10 olan kayıt için istekte
bulunulduğunda bu kayıt Yazarlar tablosunda yer almadığından yanıt
204 hata kodu ile döner

Veri tabanında Yazarlar tablosuna yeni bir yazar eklemek istiyorsak,


istediğimiz özelliklerle oluşturduğumuz Yazar tipinde Json verisini Http Post
metodu ile YazarApi’sine göndermeliyiz. Burada Json verileri Görsel [Link]
görülebileceği gibi isteğin Body (Gövde) kısmına eklenmiştir. Header kısmı
incelendiğinde Content-Type’ın application/json olduğu görülecektir. Kaydetme
işlemi başarılı olduğundan 200-ok durum kodu dönmüştür. Bu istek yapıldığında
http isteğinin gövdesinde bulunan json datası bu isteği karşılayan Post action
metodu ile Yazarlar tablosuna eklenmiştir. Burada FromBody istek gövdesinden
(request body) değerleri alır.

[HttpPost]
public void Post([FromBody] Yazar y)
{
[Link](y);
[Link]();
}

242
WEB PROGRAMLAMA 2

Görsel 86. Api’ye Http Post metodu ile istekte bulunulduğunda, isteğin
Body kısmında yer alan Json verileri Yazarlar tablosuna eklenmiştir

Veri tabanında Yazarlar tablosuna ait bir kayıt üzerinde güncelleme yapmak
istiyorsak, güncelleme yapmak istediğimiz kayda ait değeri ve güncelleme
verilerini isteğin body kısmına json formatında yerleştirip http Put metodu ile
YazarApi’sine göndermeliyiz (örnek için güncelleme yapılmak istenen kayda ait
değer URL ile gönderilmiştir. -Örnek için id 13- Bu değer de isteğin body kısmında
gönderilebilir).
[HttpPut(“{id}”)]
public IActionResult Put(int id, [FromBody] Yazar y)
{
var y1 = [Link](x => [Link] == id);
if (y1 is null)
{
return NotFound();
}
else
{
[Link] = [Link];
[Link] = [Link];
[Link](y1);
[Link]();

243
return Ok();
}

}
Eğer Yazarlar tablosunda güncellenmek istenen kayıt bulunamasaydı,
kodumuzda yazdığımız NotFound() ile 404-Bulunamadı mesajını alırdık.

Görsel 87. Api’ye Http Put metodu ile id’si 13 olan kayıt için istekte
bulunulduğunda Body kısmında yer alan Json verileri Yazarlar tablosunda
ilgili kayıt için güncellenecektir

Http metodu Delete olarak ayarlayıp API’mize [Link]


Yazarapi/13 (13 nolu kaydın Yazarlar tablosunda olduğu düşünüldüğünde) Url’si
ile istekte bulunulduğunda; ilgili kayıt, bu isteği aşağıdaki gibi karşılayan action
metot ile Yazarlar tablosundan silinecektir.
[HttpDelete(“{id}”)]
public ActionResult Delete(int id)
{
var y1 = [Link](s => [Link] == id);
if (y1 is null)
{
return NotFound();
}
else

244
WEB PROGRAMLAMA 2

{
[Link](y1);
[Link]();
return Ok();

Eğer Yazarlar tablosunda silinmek istenen kayıt bulunamasaydı kodumuzda


yazdığımız NotFound() ile 404- Bulunamadı mesajını alırdık.

}
Görsel 88. Api’ye Http Delete metodu ile id’si 13 olan kayıt için istekte
bulunulduğunda bu kayıt Yazarlar tablosundan silinecektir.

CRUD işlemlerine ait API, model class’ı ile veri tabanına bağlı bir şekilde
otomatik oluşturulmak istendiğinde Controller oluşturulurken “MVC Controller
with views, using Entity Framework” seçilir. Model class bölümünde istenen
model seçilip işlem tamamlandığında API otomatik olarak oluşturulur.

245
Bu Bölümde Ne Öğrendik?

* API, programcıların bir uygulamanın, işletim sisteminin veya diğer hizmetlerin belirli özelliklerine veya
verilerine erişmesine izin veren bir dizi işleve sahip bir tür arayüzdür.

* Web üzerinde farklı platformlarda çalışan pek çok uygulamaya, kaynak verilerini direk erişime
açmadan bu verilerin hızlı ve basit bir şekilde sunulması, uygulamaların ortak bir dil konuşmasını
sağlama fikri olan Web API’ ler ile gerçekleşir.

* Web API’ler ile farklı platform ve sistemdeki uygulamalar ortak bir dil ile iletişim kurmuş olurlar.

* Web API’ler yaygınlaştıkça, bilgi alışverişini standartlaştırmaya yardımcı olmak için SAOP olarak
bilinen bir protokol tanımlanmış ve geliştirilmiştir.

* REST mimari kısıtlamalarına uyan Web API’lerine RerstFull API’ler denir. REST bir mimari tarz iken,
SOAP bir protokoldür.

* Web API’ler yanıt mesajlarının yapısının tanımını sağlarlar. Text ve csv gibi birçok farklı yapıda
dönüş tipi kullanılabilir olsa da yanıt mesajları genellikle farklı uygulama türleri için kolayca
anlaşılıp işlenebilen format olan XML ve JSON (JavaScript Object Notation) biçimindedir. Web
API’ler varsayılan olarak JSON ve XML verilerini işler.

* REST mimarisi http iletişim protokolünü kullanır ve bu protokolü standart olarak benimsemiştir. Rest
API kullanıldığında istek ve yanıtlar http protokolü üzerinden gerçekleştirilir.

* Web üzerinden sunulan REST API’lerinin doğası gereği, bu API’ler, GET, POST, DELETE ve PUT
gibi HTTP protokolüne ait metotlar kullanarak istemciler ile iletişim kurar. Bu noktada, HTTP
metotları ile CRUD işlevleri arasında bir örtüşme tanımlanmıştır. Dört ana HTTP metodu (GET,
PUT, POST ve DELETE) CRUD işlemlerinde Create - Post metodu, Read - Get metodu, Update –
Put metodu, Delete – Delete metodu ile eşleştirilecek şekilde işlemler gerçekleştirilir.

246
WEB PROGRAMLAMA 2

Kaynakça
[Link] [Link]
cation-programming-interfaces view/older-versions/creating-a-web-api-that-supports-c-
rud-operations
[Link]
Hands-On RESTful Web Services with [Link] Core 3,
[Link]
Samuele Resca 2019
[Link]
Building RESTful Web Services with .NET Core: Develo-
pi-tutorials/
ping Distributed Web Services to improve scalability with
[Link] .NET Core 2.0 and [Link] Core 2.0, Gaurav Aroraa, Tadit
Dash 2018
[Link]
rest-methods/

247
Bölüm Soruları
1) [Link] Core Rest Api mimarisinde bir kayıt eklemek istediğimizde bu
isteğe yanıt veren metot hangi öz nitelik ile belirtilmelidir?
a) HttpGet
b) HttpPost
c) HttpDelete
d) HttpPut
e) HttpUpdate

2)
[Route("api/[controller]")]
Routing yapısı yukarıdaki gibi olan OgrenciController ismindeki bir
ApiController içerisinde aşağıdaki gibi yer alan Get() metodu nasıl
çağrılabilir?
[HttpGet]
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
a) [Link]
b) [Link]
c) [Link]
d) [Link]
e) [Link]

3) Bir web API isteğinde istemcinin istediğine “İçerik Yok” şeklinde dönen
yanıt hangi http durumu koduna sahiptir?
a) 100
b) 200
c) 204
d) 106
e) 500

4) Bir web API’den aşağıda verilen şekilde bir cevap döndü ise cevap tipi
nedir?
{
"Ad": "Ömer",
"Soyad": "Tan",
"Durum": 1
}
a) XML b) Cs c) PHP d) JSON e) Cshtml

248
WEB PROGRAMLAMA 2

5) Json formatında bir API isteğinde bulunan bir istemcinin içerik türünü
nasıl ayarlaması gerekir?
a) Type "json"
b) Content json"
c) Content-Type "application/json"
d) Content-Include "json"
e) Json "application "

6) SOP açılımı nedir?


a) Simple Object Access Protocol
b) Standard Object Access Protocol
c) Sized Object Access Protocol
d) Sized Object Approach Protocol
e) Standart Object Aproach Packed

7) Bir web API isteğinde istemcinin istek yapılan kaynağın bulunamadığını


belirten yanıt hangi http durumu koduna sahiptir?
a) 401
b) 402
c) 403
d) 404
e) 405

8) [Link] Core MVC’ de oluşturulan bir Rest API’de CRUD işlemlerinden


Create hangi http metodu ile karşılanmalıdır?
a) HttpGet
b) HttpPost
c) HttpDelete
d) HttpCreate
e) Create

9) [Link] Core MVC’de oluşturulan bir Rest Api’de [Link]


Ogrenci/10 adresine bir Http Get metodu isteği gönderildiğini varsayarsak
bu durumda RestFull mimarisine göre hangi işlemin yapılması beklenir?
a) Tüm kayıtların güncellenmesi
b) 10 numaralı kaydın getirilmesi
c) 10 numaralı kaydın silinmesi
d) 10 numaralı kaydın güncellenmesi
e) Tüm kayıtların getirilmesi

249
I. İstemci-Sunucu Mimarisi
II. Ön Bellekleme
III. Katmanlı Sistem
10) API'lerin RestFull API olabilmeleri için bazı kısıtlamalara uymaları
gerekmektedir. Yukarıda verilenlerden hangisi/hangileri uyulması
gereken kısıtlamalardandır?
a) Yalnız I
b) Yalnız II
c) I ve II
d) I ve III
e) I, II ve III

Cevaplar
1-b 2-e 3-c 4-d 5-c 6-a 7-d 8-b 9-b 10-e

250

You might also like