Web Programlama.
Web Programlama.
WEB PROGRAMLAMA 2
DR. ÖĞR. ÜYESİ CAN YÜZKOLLAR
WEB PROGRAMLAMA 2
DR. ÖĞR. ÜYESİ CAN YÜZKOLLAR
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.
III
IV
WEB PROGRAMLAMA 2
İçindekiler
ÖN SÖZ III
V
3.4. Döngüler 59
Bu Bölümde Ne Öğrendik? 63
Kaynakça 64
Bölüm Soruları 65
VI
WEB PROGRAMLAMA 2
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
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:
2
WEB PROGRAMLAMA 2
3
Şekil 1
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.
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.
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.
6
WEB PROGRAMLAMA 2
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
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.
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
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.
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
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
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.
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.
14
WEB PROGRAMLAMA 2
• 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.
16
WEB PROGRAMLAMA 2
Çizim 2
gRPC gRPC
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.
18
WEB PROGRAMLAMA 2
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.
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.
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.
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
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
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
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.
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.
30
WEB PROGRAMLAMA 2
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.
32
WEB PROGRAMLAMA 2
Okuma Önerisi
[Link] ve MVC Temelli Esnek
(Responsive) Web Uygulaması
konulu makaleyi çevrim içi olarak
aşağıdaki bağlantıdan okuyabi-
lirsiniz.
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.
[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.
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.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
37
Görsel 14. Controller Ekleme
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
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.
return Json(JsonData);
}
• ContentResult, ContentResult kullanılarak string, HTML veya JSON
döndürülebilir.
40
WEB PROGRAMLAMA 2
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.
43
Görsel 22. OgrenciController’ındaki bilgi Action’unun çağrılması
44
WEB PROGRAMLAMA 2
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.
* 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
48
WEB PROGRAMLAMA 2
a) Yalnız I
b) Yalnız II
c) I ve II
d) II ve III
e) I,II ve III
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.
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
Footer
52
WEB PROGRAMLAMA 2
<!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”;
}
54
WEB PROGRAMLAMA 2
HTML
Pure
+ View Engine
HTML
C# Code
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
*/
56
WEB PROGRAMLAMA 2
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
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” };
}
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.
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 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
@{
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
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>
@{
var i = 0;
while (i < 5)
{
i += 4;
<div>Deger @i</div>
}
}
66
WEB PROGRAMLAMA 2
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>
}
}
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
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
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.
72
WEB PROGRAMLAMA 2
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).
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.
[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.
78
WEB PROGRAMLAMA 2
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
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">
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”);
}
85
9) [Link] şeklinde gelen isteği karşılayacak
metot nasıl tanımlanabilir?
86
WEB PROGRAMLAMA 2
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.
yöntem değildir. Genel olarak istemci taraflı kullanılan durum yönetimi teknikleri
aşağıda açıklanmıştır:
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.
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));
94
WEB PROGRAMLAMA 2
İ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
{
};
// 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>
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]);
[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>
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.
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
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.
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.
102
WEB PROGRAMLAMA 2
@{
string msj = (string)ViewData[“Ad”];
string mj2 = [Link];
int a = (int)TempData[“No”];
}
103
viewdata= @ViewData[“Msg2”] <br />
tempdata= @TempData[“Msg3”]
104
WEB PROGRAMLAMA 2
[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.
* 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
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>
108
WEB PROGRAMLAMA 2
6)
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]();
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.
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.
112
WEB PROGRAMLAMA 2
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>
114
WEB PROGRAMLAMA 2
115
Tablo 4. Bazı yaygın .NET türlerine karşılık oluşturulan HTML input
özellikleri
Ö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=”” />
116
WEB PROGRAMLAMA 2
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.
117
Display özelliği eklendikten sonra proje çalıştırıldığında
118
WEB PROGRAMLAMA 2
119
Index() action metodunun çağırdığı view içinde yukarıdaki kod yazılırsa
Görsel [Link] gibi bir çıktı elde edilir:
120
WEB PROGRAMLAMA 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ı
122
WEB PROGRAMLAMA 2
@{
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 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]
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>
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”
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.
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”
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
132
WEB PROGRAMLAMA 2
Server-Side Validation
HTML form
Controller
Results Client-Side Results Code, etc
Validation
javaScript
Client-Side Server-Side
133
Şekil 9. Doğrulama İçin Kullanılan Öz nitelikler ve Kullanımına Örnek
[Required]
[EmailAddress(ErrorMessage =”Geçerli bir mail adres giriniz”)]
public string Email { get; set; }
}
134
WEB PROGRAMLAMA 2
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; }
@{
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
<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ı
138
WEB PROGRAMLAMA 2
}
else
{
//Doğrulama başarısız. Kullanıcıya hata Mesajı verdirilmeli
}
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; }
[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; }
}
}
140
WEB PROGRAMLAMA 2
{
return View();
}
public IActionResult Ekle()
{
return View();
}
}
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
<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>();
[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
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.
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”;
}
<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
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
151
Görsel 54. Öğrenci Ekleme aşamasında çalışan kullanıcı taraflı
doğrulama
152
WEB PROGRAMLAMA 2
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] [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)
156
WEB PROGRAMLAMA 2
157
…………….
public string KullanciAdi { get; set; }
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)
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
160
WEB PROGRAMLAMA 2
// 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.
162
WEB PROGRAMLAMA 2
return (txt);
}
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.
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();
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 }
};
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.
166
WEB PROGRAMLAMA 2
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
168
WEB PROGRAMLAMA 2
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
173
public string Sorgu()
{
int[] sayilar = new int[] { 20, 10, 30, 50,40};
var d=[Link](x=>x);
return [Link]().ToString();
}
174
WEB PROGRAMLAMA 2
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
178
WEB PROGRAMLAMA 2
O/R Mapping
Object
MappingLogic
Object
DB
Object
Tablo 5. Bir veri tabanı ve .NET yazılımı arasında EF Core ile eşlenen
ögeler
180
Çizim 9 WEB PROGRAMLAMA 2
Database-First Approach
Code-First Approach
Database
181
Şekil 13. EF Core için Veritabanı sağlayıcıları ve NuGet paketleri
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.
184
WEB PROGRAMLAMA 2
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;
}
[ForeignKey(“Yazar”)]
public int YazarNo { get; set; }
public Yazar Yazar { get; set; }
[NotMapped]
public int OgrYas { get; set; }
186
WEB PROGRAMLAMA 2
187
Görsel 62. Kitaplar ve Yazarlar tabloları ilişkileri
188
WEB PROGRAMLAMA 2
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:
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]();
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);
namespace [Link]
{
public class KitaplikContext: DbContext
{
public DbSet<Kitap> Kitaplar { get; set; }
public DbSet<Yazar> Yazarlar { get; set; }
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;
192
WEB PROGRAMLAMA 2
193
Görsel 66. Oluşan Migration klasörü
194
WEB PROGRAMLAMA 2
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>
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()
{
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
@{
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
@model [Link]
@{
ViewData[“Title”] = “Create”;
}
<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);
}
}
}
}
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
206
WEB PROGRAMLAMA 2
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.
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;
// 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();
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();
}
[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();
}
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));
}
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; }
214
WEB PROGRAMLAMA 2
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.
* .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
218
WEB PROGRAMLAMA 2
……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
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.
222
WEB PROGRAMLAMA 2
Çizim 10
Web Uygulaması
Veritabanı
223
Çizim 12
Web Uygulaması
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.
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.
226
WEB PROGRAMLAMA 2
• 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.
228
WEB PROGRAMLAMA 2
229
Şekil 17. CRUD İşlevlerinin Temel Fikri
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.
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.
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
234
WEB PROGRAMLAMA 2
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.
236
WEB PROGRAMLAMA 2
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
}
}
}
239
Görsel 83. Http Get Metodu ile istekte bulunan Api’ye ait yanıt -
Yazarlar tablosundaki tüm kayıtlar getiriliyor
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
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
[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
244
WEB PROGRAMLAMA 2
{
[Link](y1);
[Link]();
return Ok();
}
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 "
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