ASP.NET Web Sayfaları (Razor) Sitesinde Resimlerle Çalışma
yazan: Tom FitzMacken
Bu makalede, ASP.NET Web Sayfaları (Razor) web sitesinde resimleri ekleme, görüntüleme ve işleme (filigranları yeniden boyutlandırma, çevirme ve ekleme) gösterilmektedir.
Öğrenecekleriniz:
- Sayfaya dinamik olarak resim ekleme.
- Kullanıcıların görüntü yüklemesine izin verme.
- Resmi yeniden boyutlandırma.
- Resmi çevirme veya döndürme.
- Resme filigran ekleme.
- Resmi filigran olarak kullanma.
Makalede tanıtılan ASP.NET programlama özellikleri şunlardır:
- Yardımcı
WebImage
.- Yol
Path
ve dosya adlarını işlemenize olanak tanıyan yöntemler sağlayan nesnesi.Öğreticide kullanılan yazılım sürümleri
- ASP.NET Web Sayfaları (Razor) 2
- WebMatrix 2
Bu öğretici, WebMatrix 3 ile de çalışır.
Web Sayfasına Dinamik Olarak Görüntü Ekleme
Web sitesini geliştirirken web sitenize ve tek tek sayfalara resim ekleyebilirsiniz. Ayrıca kullanıcıların resim yüklemesine izin vererek profil fotoğrafı eklemelerine izin verme gibi görevler için yararlı olabilir.
Sitenizde zaten bir görüntü varsa ve yalnızca bir sayfada görüntülemek istiyorsanız, aşağıdakine benzer bir HTML <img>
öğesi kullanırsınız:
<img src="images/Photo1.jpg" alt="Sample Photo" />
Ancak bazen resimleri dinamik olarak görüntüleyebilmelisiniz; başka bir deyişle, sayfa çalışana kadar hangi görüntünün görüntüleneceğini bilemeyebilirsiniz.
Bu bölümdeki yordamda, kullanıcıların görüntü adları listesinden görüntü dosyası adını belirttiği anında bir görüntünün nasıl görüntüleneceği gösterilmektedir. Açılan listeden resmin adını seçer ve sayfayı gönderdiklerinde seçtikleri resim görüntülenir.
WebMatrix'te yeni bir web sitesi oluşturun.
DynamicImage.cshtml adlı yeni bir sayfa ekleyin.
Web sitesinin kök klasörüne yeni bir klasör ekleyin ve bunu görüntüler olarak adlandırın.
Yeni oluşturduğunuz images klasörüne dört resim ekleyin. (Kullanışlı olan tüm resimler işe yarar, ancak bunlar bir sayfaya sığmalıdır.) ,Photo2.jpg, Photo3.jpgve Photo4.jpgPhoto1.jpggörüntüleri yeniden adlandırın. (Bu yordamda Photo4.jpg kullanmayacaksınız, ancak makalenin ilerleyen bölümlerinde kullanacaksınız.)
Dört görüntünün salt okunur olarak işaretlenmediğini doğrulayın.
Sayfadaki mevcut içeriği aşağıdakilerle değiştirin:
@{ var imagePath= ""; if( Request["photoChoice"] != null){ imagePath = @"images\" + Request["photoChoice"]; } } <!DOCTYPE html> <html> <head> <title>Display Image on the Fly</title> </head> <body> <h1>Displaying an Image On the Fly</h1> <form method="post" action=""> <div> I want to see: <select name="photoChoice"> <option value="Photo1.jpg">Photo 1</option> <option value="Photo2.jpg">Photo 2</option> <option value="Photo3.jpg">Photo 3</option> </select> <input type="submit" value="Submit" /> </div> <div style="padding:10px;"> @if(imagePath != ""){ <img src="@imagePath" alt="Sample Image" width="300px" /> } </div> </form> </body> </html>
Sayfanın gövdesinde adlı
photoChoice
bir açılan liste (öğe<select>
) vardır. Listede üç seçenek vardır vevalue
her liste seçeneğinin özniteliği images klasörüne yerleştirdiğiniz görüntülerden birinin adına sahiptir. Temelde, liste kullanıcının "Fotoğraf 1" gibi kolay bir ad seçmesine olanak tanır ve sayfa gönderildiğinde .jpg dosya adını geçirir.Kodda, okuyarak
Request["photoChoice"]
kullanıcının seçimini (başka bir deyişle resim dosyası adı) listeden alabilirsiniz. Öncelikle bir seçim olup olmadığını görürsünüz. Varsa, görüntü için görüntülerin klasörünün adından ve kullanıcının resim dosyası adından oluşan bir yol oluşturursunuz. (Bir yol oluşturmayı denediyseniz ancak içindeRequest["photoChoice"]
hiçbir şey yoksa hata alırsınız.) Bunun sonucunda şuna benzer göreli bir yol elde edin:görüntüler/Photo1.jpg
Yol, sayfanın ilerleyen bölümlerinde ihtiyacınız olacak adlı
imagePath
değişkende depolanır.Gövdede, kullanıcının seçtiği görüntüyü görüntülemek için kullanılan bir
<img>
öğe de vardır.src
Özniteliği, statik bir öğeyi görüntülemek için yaptığınız gibi bir dosya adına veya URL'ye ayarlanmadı. Bunun yerine olarak ayarlanır@imagePath
, yani değerini kodda ayarladığınız yoldan alır.Ancak sayfa ilk kez çalıştırıldığında, kullanıcı hiçbir şey seçmediğinden görüntülenecek görüntü yoktur. Bu normalde özniteliğin
src
boş olacağı ve görüntünün kırmızı bir "x" olarak gösterileceği anlamına gelir (veya tarayıcı görüntü bulamadıklarında her ne işleyecekse). Bunu önlemek için öğesini, değişkenin<img>
içinde herhangi bir şey olup olmadığını görmek üzere test eden birif
bloğunaimagePath
yerleştirirsiniz. Kullanıcı bir seçim yaptıysa,imagePath
yolu içerir. Kullanıcı bir görüntü seçmediyse veya sayfa ilk kez görüntüleniyorsa,<img>
öğe işlenmez.Dosyayı kaydedin ve sayfayı tarayıcıda çalıştırın. (Sayfayı çalıştırmadan önce Dosyalar çalışma alanında seçili olduğundan emin olun.)
Açılan listeden bir resim seçin ve Örnek Görüntü'ye tıklayın. Farklı seçenekler için farklı görüntüler gördüğünüzden emin olun.
Görüntü Karşıya Yükleme
Önceki örnekte, bir görüntünün dinamik olarak nasıl görüntüleneceği gösterildi, ancak yalnızca web sitenizde bulunan görüntülerle çalıştı. Bu yordamda, kullanıcıların bir görüntüyü karşıya yüklemesine nasıl izin verileceği gösterilir ve bu görüntü daha sonra sayfada görüntülenir. ASP.NET'da, görüntüleri oluşturmanıza, işlemenize ve kaydetmenize olanak tanıyan yöntemlere sahip yardımcıyı kullanarak WebImage
görüntüleri anında işleyebilirsiniz. Yardımcı, WebImage
.jpg,.png ve .bmpdahil olmak üzere tüm yaygın web görüntüsü dosya türlerini destekler. Bu makale boyunca .jpg görüntü kullanacaksınız, ancak görüntü türlerinden herhangi birini kullanabilirsiniz.
Yeni bir sayfa ekleyin ve uploadImage.cshtml olarak adlandırnın.
Sayfadaki mevcut içeriği aşağıdakilerle değiştirin:
@{ WebImage photo = null; var newFileName = ""; var imagePath = ""; if(IsPost){ photo = WebImage.GetImageFromRequest(); if(photo != null){ newFileName = Guid.NewGuid().ToString() + "_" + Path.GetFileName(photo.FileName); imagePath = @"images\" + newFileName; photo.Save(@"~\" + imagePath); } } } <!DOCTYPE html> <html> <head> <title>Image Upload</title> </head> <body> <form action="" method="post" enctype="multipart/form-data"> <fieldset> <legend> Upload Image </legend> <label for="Image">Image</label> <input type="file" name="Image" /> <br/> <input type="submit" value="Upload" /> </fieldset> </form> <h1>Uploaded Image</h1> @if(imagePath != ""){ <div class="result"> <img src="@imagePath" alt="image" /> </div> } </body> </html>
Metnin gövdesinde, kullanıcıların karşıya yüklenecek dosyayı
<input type="file">
seçmesine olanak tanıyan bir öğesi vardır. Gönder'e tıkladığında, seçtikleri dosya formla birlikte gönderilir.Karşıya yüklenen görüntüyü almak için, görüntülerle çalışmak için her türlü yararlı yönteme sahip olan yardımcıyı kullanırsınız
WebImage
. Özellikle, karşıya yüklenen görüntüyü (varsa) almak ve adlıphoto
bir değişkende depolamak için kullanırsınızWebImage.GetImageFromRequest
.Bu örnekteki çalışmanın çoğu dosya ve yol adlarını alma ve ayarlamayı içerir. Sorun, kullanıcının karşıya yüklediği görüntünün adını (ve yalnızca adını) almak ve ardından görüntüyü depoladığınız yer için yeni bir yol oluşturmak istemenizdir. Kullanıcılar aynı ada sahip birden çok görüntüyü karşıya yükleyebileceğinden, benzersiz adlar oluşturmak ve kullanıcıların mevcut resimlerin üzerine yazmadığından emin olmak için biraz ek kod kullanırsınız.
Bir görüntü gerçekten karşıya yüklenmişse (test
if (photo != null)
), görüntünün özelliğindenFileName
görüntü adını alırsınız. Kullanıcı görüntüyü karşıya yüklediğinde,FileName
kullanıcının bilgisayarındaki yolu içeren özgün adını içerir. Şu şekilde görünebilir:C:\Users\Joe\Pictures\SamplePhoto1.jpg
Ancak tüm bu yol bilgilerini istemiyorsunuz; yalnızca gerçek dosya adını (SamplePhoto1.jpg) istiyorsunuz. yöntemini kullanarak
Path.GetFileName
bir yoldan yalnızca dosyayı çıkarabilirsiniz, örneğin:Path.GetFileName(photo.FileName)
Ardından, özgün ada bir GUID ekleyerek yeni bir benzersiz dosya adı oluşturursunuz. (GUID'ler hakkında daha fazla bilgi için bu makalenin devamında yer alan GUID'ler hakkında bölümüne bakın.) Ardından, görüntüyü kaydetmek için kullanabileceğiniz tam bir yol oluşturursunuz. Kaydetme yolu yeni dosya adından, klasörden (görüntüler) ve geçerli web sitesinin konumundan oluşur.
Not
Kodunuzun images klasörüne dosya kaydetmesi için uygulamanın bu klasör için okuma-yazma izinlerine sahip olması gerekir. Geliştirme bilgisayarınızda bu genellikle bir sorun değildir. Ancak, sitenizi bir barındırma sağlayıcısının web sunucusunda yayımladığınızda, bu izinleri açıkça ayarlamanız gerekebilir. Bu kodu bir barındırma sağlayıcısının sunucusunda çalıştırır ve hata alırsanız, bu izinleri nasıl ayarlayabileceğinizi öğrenmek için barındırma sağlayıcısına başvurun.
Son olarak, yardımcının yöntemine
Save
WebImage
kaydetme yolunu geçirirsiniz. Bu, karşıya yüklenen görüntüyü yeni adı altında depolar. Kaydetme yöntemi şöyle görünür:photo.Save(@"~\" + imagePath)
. Tam yol, geçerli web sitesi konumu olan öğesine eklenir@"~\"
. (İşleç~
hakkında daha fazla bilgi için bkz. Razor Söz Dizimini Kullanarak ASP.NET Web Programlamaya Giriş.)Önceki örnekte olduğu gibi, sayfanın gövdesinde görüntüyü görüntülemek için bir
<img>
öğe bulunur. ayarlandıysaimagePath
,<img>
öğesi işlenir vesrc
özniteliği değereimagePath
ayarlanır.Sayfayı tarayıcıda çalıştırın.
Bir görüntüyü karşıya yükleyin ve sayfada görüntülendiğinden emin olun.
Sitenizde images klasörünü açın. Dosya adı şu şekilde görünen yeni bir dosya eklendiğini görürsünüz:
45ea4527-7ddd-4965-b9ca-c6444982b342_MyPhoto.png
Bu, adına bir GUID ön eki eklenerek karşıya yüklediğiniz görüntüdür. (Kendi dosyanız farklı bir GUID'ye sahip olur ve büyük olasılıkla MyPhoto.pngfarklı bir adla adlandırılır.)
İpucu
GUID'ler hakkında
GUID (genel olarak benzersiz kimlik), genellikle şöyle bir biçimde işlenen bir tanımlayıcıdır: 936DA01F-9ABD-4d9d-80C7-02AF85C822A8
. Sayılar ve harfler (A-F'den) her GUID için farklılık gösterir, ancak hepsi 8-4-4-4-4-12 karakterlik grupları kullanma desenini izler. (Teknik olarak, GUID 16 bayt/128 bit sayıdır.) GUID'ye ihtiyacınız olduğunda, sizin için bir GUID oluşturan özel kod çağırabilirsiniz. GUID'lerin ardındaki fikir, sayının muazzam boyutu (3,4 x 1038) ile bunu oluşturma algoritması arasında elde edilen sayının bir tür olması neredeyse garanti edilir. Bu nedenle GUID'ler, aynı adı iki kez kullanmayabileceğinizi garanti etmeniz gerektiğinde öğeler için ad oluşturmanın iyi bir yoludur. Dezavantajı, guid'lerin özellikle kullanıcı dostu olmadığından ad yalnızca kodda kullanıldığında kullanılma eğilimindedir.
Görüntüyü Yeniden Boyutlandırma
Web siteniz bir kullanıcının görüntülerini kabul ederse, görüntülemeden veya kaydetmeden önce resimleri yeniden boyutlandırmak isteyebilirsiniz. Bunun için yardımcıyı WebImage
yeniden kullanabilirsiniz.
Bu yordam, karşıya yüklenen bir görüntüyü yeniden boyutlandırarak küçük resim oluşturmayı ve ardından küçük resmi ve özgün görüntüyü web sitesine kaydetmeyi gösterir. Küçük resmi sayfada görüntüler ve kullanıcıları tam boyutlu resme yönlendirmek için bir köprü kullanırsınız.
Thumbnail.cshtml adlı yeni bir sayfa ekleyin.
images klasöründe thumbs adlı bir alt klasör oluşturun.
Sayfadaki mevcut içeriği aşağıdakilerle değiştirin:
@{ WebImage photo = null; var newFileName = ""; var imagePath = ""; var imageThumbPath = ""; if(IsPost){ photo = WebImage.GetImageFromRequest(); if(photo != null){ newFileName = Guid.NewGuid().ToString() + "_" + Path.GetFileName(photo.FileName); imagePath = @"images\" + newFileName; photo.Save(@"~\" + imagePath); imageThumbPath = @"images\thumbs\" + newFileName; photo.Resize(width: 60, height: 60, preserveAspectRatio: true, preventEnlarge: true); photo.Save(@"~\" + imageThumbPath); } } } <!DOCTYPE html> <html> <head> <title>Resizing Image</title> </head> <body> <h1>Thumbnail Image</h1> <form action="" method="post" enctype="multipart/form-data"> <fieldset> <legend> Creating Thumbnail Image </legend> <label for="Image">Image</label> <input type="file" name="Image" /> <br/> <input type="submit" value="Submit" /> </fieldset> </form> @if(imagePath != ""){ <div class="result"> <img src="@imageThumbPath" alt="Thumbnail image" /> <a href="@Html.AttributeEncode(imagePath)" target="_Self"> View full size </a> </div> } </body> </html>
Bu kod, önceki örnekteki koda benzer. Aradaki fark, bu kodun resmi normal bir şekilde ve siz resmin küçük resim kopyasını oluşturduktan sonra iki kez kaydetmesidir. İlk olarak karşıya yüklenen görüntüyü alır ve görüntüler klasörüne kaydedersiniz. Ardından küçük resim görüntüsü için yeni bir yol oluşturursunuz. Küçük resmi oluşturmak için yardımcının
WebImage
Resize
yöntemini çağırarak 60 piksele 60 piksellik bir görüntü oluşturursunuz. Örnekte en boy oranını nasıl koruduğunuz ve görüntünün büyütülmesini nasıl önleyebileceğiniz gösterilmektedir (yeni boyutun görüntüyü büyütme olasılığına karşı). Yeniden boyutlandırılan görüntü daha sonra başparmak alt klasörüne kaydedilir.İşaretlemeyi tamamladığınızda, görüntüyü koşullu olarak göstermek için önceki örneklerde gördüğünüz dinamik
src
öznitelikle aynı<img>
öğeyi kullanırsınız. Bu durumda küçük resmi görüntülersiniz. Görüntünün büyük sürümüne köprü oluşturmak için de bir<a>
öğe kullanırsınız. öğesininsrc
özniteliğinde<img>
olduğu gibi öğesininhref
özniteliğini<a>
içindeimagePath
olan öğeye dinamik olarak ayarlarsınız. Yolun URL olarak çalışabilmesini sağlamak için, yoldakiHtml.AttributeEncode
ayrılmış karakterleri URL'de tamam olan karakterlere dönüştüren yöntemine geçirirsinizimagePath
.Sayfayı tarayıcıda çalıştırın.
Bir fotoğraf yükleyin ve küçük resmin gösterildiğini doğrulayın.
Tam boyutlu görüntüyü görmek için küçük resme tıklayın.
Görüntülerde ve görüntülerde/başparmaklarda yeni dosyaların eklendiğine dikkat edin.
Resmi Döndürme ve Çevirme
Yardımcı WebImage
ayrıca resimleri çevirmenize ve döndürmenize de olanak tanır. Bu yordam, sunucudan görüntü almayı, görüntüyü baş aşağı çevirmeyi (dikey olarak) çevirmeyi, kaydetmeyi ve ardından çevrilmiş görüntüyü sayfada görüntülemeyi gösterir. Bu örnekte, sunucuda zaten sahip olduğunuz bir dosyayı kullanıyorsunuz (Photo2.jpg). Gerçek bir uygulamada, önceki örneklerde yaptığınız gibi adını dinamik olarak aldığınız bir görüntüyü büyük olasılıkla çevirirsiniz.
FlipImage.cshtml adlı yeni bir sayfa ekleyin.
Sayfadaki mevcut içeriği aşağıdakilerle değiştirin:
@{ var imagePath= ""; WebImage photo = new WebImage(@"~\Images\Photo2.jpg"); if(photo != null){ imagePath = @"images\Photo2.jpg"; photo.FlipVertical(); photo.Save(@"~\" + imagePath); } } <!DOCTYPE html> <html> <head> <title>Get Image From File</title> <meta http-equiv="content-type" content="text/html;charset=utf-8" /> </head> <body> <h1>Flip Image Vertically</h1> @if(imagePath != ""){ <div class="result"> <img src="@imagePath" alt="Image" /> </div> } </body> </html>
Kod, sunucudan
WebImage
görüntü almak için yardımcıyı kullanır. Görüntü kaydetmek için önceki örneklerde kullandığınız tekniği kullanarak görüntünün yolunu oluşturur ve kullanarakWebImage
bir görüntü oluşturduğunuzda bu yolu geçirirsiniz:WebImage photo = new WebImage(@"~\Images\Photo2.jpg");
Bir görüntü bulunursa, önceki örneklerde yaptığınız gibi yeni bir yol ve dosya adı oluşturursunuz. Görüntüyü çevirmek için yöntemini çağırıp
FlipVertical
görüntüyü yeniden kaydedersiniz.Görüntü, özniteliği olarak ayarlanmış
imagePath
öğesisrc
kullanılarak<img>
sayfada yeniden görüntülenir.Sayfayı tarayıcıda çalıştırın. Photo2.jpg resmi baş aşağı gösterilir.
Sayfayı yenileyin veya resmin yeniden sağ tarafa çevrildiğini görmek için sayfayı yeniden isteyin.
Bir görüntüyü döndürmek için, veya çağrısı FlipVertical
yapmak yerine veya FlipHorizontal
RotateRight
çağrısı yapmak yerine aynı kodu kullanırsınızRotateLeft
.
Resme Filigran Ekleme
Web sitenize resim eklediğinizde, kaydetmeden veya sayfada görüntülemeden önce resme filigran eklemek isteyebilirsiniz. Kişiler bir resme telif hakkı bilgileri eklemek veya iş adlarını tanıtmak için filigranları genellikle kullanır.
Watermark.cshtml adlı yeni bir sayfa ekleyin.
Sayfadaki mevcut içeriği aşağıdakilerle değiştirin:
@{ var imagePath= ""; WebImage photo = new WebImage(@"~\Images\Photo3.jpg"); if(photo != null){ imagePath = @"images\Photo3.jpg"; photo.AddTextWatermark("My Watermark", fontColor:"Yellow", fontFamily: "Arial"); photo.Save(@"~\" + imagePath); } } <!DOCTYPE html> <html> <head> <title>Water Mark</title> <meta http-equiv="content-type" content="text/html;charset=utf-8" /> </head> <body> <h1>Adding a Watermark to an Image</h1> @if(imagePath != ""){ <div class="result"> <img src="@imagePath" alt="Image" /> </div> } </body> </html>
Bu kod, daha önceki FlipImage.cshtml sayfasındaki kod gibidir (ancak bu kez Photo3.jpg dosyasını kullanır). Filigranı eklemek için, görüntüyü kaydetmeden önce yardımcının
WebImage
AddTextWatermark
yöntemini çağırırsınız. çağrısındaAddTextWatermark
"Filigranım" metnini geçirir, yazı tipi rengini sarıya ayarlar ve yazı tipi ailesini Arial olarak ayarlarsınız. (Burada gösterilmese de,WebImage
yardımcı opaklık, yazı tipi ailesi ve yazı tipi boyutu ile filigran metninin konumunu belirtmenize de olanak tanır.) Görüntüyü kaydettiğinizde salt okunur olmamalıdır.Daha önce gördüğünüz gibi, src özniteliği olarak ayarlanmış
@imagePath
öğesi kullanılarak<img>
görüntü sayfada görüntülenir.Sayfayı tarayıcıda çalıştırın. Resmin sağ alt köşesindeki "Filigranım" metnine dikkat edin.
Resmi Filigran Olarak Kullanma
Filigran için metin kullanmak yerine başka bir resim kullanabilirsiniz. Kişiler bazen filigran olarak şirket logosu gibi resimler veya telif hakkı bilgileri için metin yerine filigran resmi kullanırlar.
ImageWatermark.cshtml adlı yeni bir sayfa ekleyin.
Logo olarak kullanabileceğiniz images klasörüne bir resim ekleyin ve MyCompanyLogo.jpgresmi yeniden adlandırın. Bu resim, 80 piksel genişliğinde ve 20 piksel yüksekliğinde ayarlandığında net bir şekilde görebileceğiniz bir görüntü olmalıdır.
Sayfadaki mevcut içeriği aşağıdakilerle değiştirin:
@{ var imagePath = ""; WebImage WatermarkPhoto = new WebImage(@"~\" + @"\Images\MyCompanyLogo.jpg"); WebImage photo = new WebImage(@"~\Images\Photo4.jpg"); if(photo != null){ imagePath = @"images\Photo4.jpg"; photo.AddImageWatermark(WatermarkPhoto, width: 80, height: 20, horizontalAlign:"Center", verticalAlign:"Bottom", opacity:100, padding:10); photo.Save(@"~\" + imagePath); } } <!DOCTYPE html> <html> <head> <title>Image Watermark</title> <meta http-equiv="content-type" content="text/html;charset=utf-8" /> </head> <body> <h1>Using an Image as a Watermark</h1> @if(imagePath != ""){ <div class="result"> <img src="@imagePath" alt="Image" /> </div> } </body> </html>
Bu, önceki örneklerden koddaki başka bir çeşitlemedir. Bu durumda, resmi kaydetmeden önce filigran resmini hedef resme (Photo3.jpg) eklemek için çağrısında
AddImageWatermark
bulunursunuz. çağrısıAddImageWatermark
yaptığınızda, genişliğini 80 piksel, yüksekliği 20 piksel olarak ayarlarsınız. MyCompanyLogo.jpg görüntüsü yatay olarak ortaya ve dikey olarak hedef görüntünün altına hizalanır. Opaklık %100 ve doldurma 10 piksel olarak ayarlanır. Filigran resmi hedef görüntüden büyükse hiçbir şey olmaz. Filigran resmi hedef görüntüden büyükse ve resim filigranı için doldurmayı sıfır olarak ayarlarsanız, filigran yoksayılır.Daha önce olduğu gibi, öğesini ve dinamik
src
özniteliğini<img>
kullanarak görüntüyü görüntüleyebilirsiniz.Sayfayı tarayıcıda çalıştırın. Filigran resminin ana görüntünün en altında göründüğüne dikkat edin.
Ek Kaynaklar
ASP.NET Web Sayfaları Sitesindeki Dosyalarla Çalışma
Razor Söz Dizimini Kullanarak ASP.NET Web Sayfaları Programlamaya Giriş