Resimleri Farklı Kaydet’i Engelleme

Yazdığınız uygulamadaki resimlerin indirilmesini istemiyorsanız browser default özelliği olan sağ tıklamayla resmi kaydet, resmi farklı kaydet gibi seçenekleri engellemeniz gerekir. Bunu jquery sorgusuyla basit bir şekilde yapabilirsiniz.

Buradaki slideImage resmin olduğu divin Id’sidir.

$(document).ready(function () {
$(‘#slideImage’).bind(‘contextmenu’, function () { return false; });
});

Advertisements

.Net MVC Dosya Yükleme

İlgili Linkler:

https://cmatskas.com/upload-files-in-asp-net-mvc-with-javascript-and-c/

http://forums.asp.net/t/1775264.aspx?Multiple+file+upload+with+ASP+NET+MVC

Dökümanı indirmek için :

http://stackoverflow.com/questions/3604562/download-file-of-any-type-in-asp-net-mvc-using-fileresult

http://stackoverflow.com/questions/1375486/how-to-create-file-and-return-it-via-fileresult-in-asp-net-mvc

 

Dökümanı görüntülemek için : https://code.msdn.microsoft.com/ASPNET-Document-Viewer-e7c2a39f

http://stackoverflow.com/questions/16448780/reading-and-displaying-uploaded-text-files-in-mvc

MVC Kısa Notlar

View dosyalarında Model kullanma :

sayfanın modeli tanıması için sayfanın üst kısmına

@model List<ProjectModelName.Models.TableName> tanımladıktan sonra @foreach(var item in Model ) şeklinde kullanılabilir.

 

MVC space ( boşluk ) ekleme :   

Yazdırılacak ifadeden önce   @:  kullanarak boşluk eklenebilir.

MVC Linq komutları:

Take(x): Belirtilen sayıda kayıt döner.

Hatalar ve Çözümleri

MVC : Entity ‘de bir değişiklik yapıp kaydetmeye çalıştığımızda ” Validation failed for one or more entities. See ‘EntityValidationErrors’ property for more details ” şeklinde bir hata alıyorsak  en olası sebebi şunlar olabilir  :

  1. Veritabanında (database) NULL olamaz olarak yapılandırılmış (Allow Nulls işareti kaldırılmış) bir alana NULL değer girmeye çalışmak
  2. Belirtilen üst sınır dışında veri giriyi yapmaya çalışmak, örneğin, nvarchar(5) olan bir alana 5 karakterden uzun veri girişi yapmaya çalışmak.

Çözüm olarak try catch bloğunda

catch (DbEntityValidationException e)
{
     foreach (var eve in e.EntityValidationErrors)
     {
           Response.Write(string.Format("Entity türü \"{0}\" şu hatalara sahip \"{1}\" Geçerlilik hataları:", eve.Entry.Entity.GetType().Name, eve.Entry.State));
       foreach (var ve in eve.ValidationErrors)
       {
         Response.Write(string.Format("- Özellik: \"{0}\", Hata: \"{1}\"", ve.PropertyName, ve.ErrorMessage));
        }
         Response.End();
         }



şeklinde bir kod parçasıyla hangi property’den dolayı hata alındığını görebiliriz.

C#  :  System.InvalidCastException: Specific cast is not valid (Belirtilen atama geçerli değil ) hatası : Bu hata iletilecek datanın beklenen şekilde alınmadığı ya da atandığı datatable, list vs. ile uyumlu olmadığından dolayı verilebiliyor. Bu hatayla entity’de sp’den aldığım datayı datatable atarken aldım. Sp’nin döndüğü cursor’u kontrol ettiğimde bir kolonun , den sonraki ondalık kısım da uzun bir rakamlar dizisi geldiğini gördüm. Round ile kolonun 3 haneli gelmesini sağlayınca hata düzeldi.

SQL :String or binary data would be truncated : Bu hata tabloya insert etmek ettiğiniz kayıttan dolayı alınabilir. Insert edilen kolonun length’i ile gelen data genişliği uyuşmamaktadır. Kolon length’i arttırılabilir.

MVC : Httpcontext current does not contain a definition hatası : Sebebi Controlller class’ı da HTTPCOntext isimli bir property’ye sahiptir. Buradaki HTTPContext’in altında Current property’si olmadığı için hata alınır.

HttpContext.Current kısmını System.Web.HttpContext.Current şeklinde değiştirmek gerekir.

Bu taslaktaki bölümler yavaş yazılıp yayınlanacak

Sıralı bir şekilde toparlanıp yazı yapılacak.

Poliformizm

MVVM : Uygulamadaki kavramların birbirinden ayrık olması. Arkayı düzgün yazarsan projeyi al mobile de ayarla.

MVC :

MVC Yaşam Döngüsü: Browser(Request) -> Global.asax(Routing Module) -> Controller ( Gideceği yeri kontrol edip metodu parse eder. ) -> Controller.InvokeAction -> Return View(View (View REsult) -> HTML(View Engine) ) ->Browser(Response)

ViewData[“Food”]= tip dönüşümü gerekli.

ViewBag.Food -> direkt kullan

TempData[“Food”] =sessionda depolanan data

Session[“Food”]= ViewData o an oluşturulur ve sayfa yüklemesi bitince silinir. Session’da ise o session boyunca o kayıt durur.

String ile StringBuffer(String Builder arasındaki fark)

String objesi değiştirilemez; StringBuffer /Builder değiştirilebilir.

StringBuffer syncroned; StringBuilder notsyncronized

StringBuilder da arkada yeni bir nesne oluşturup , onu değiştiriyoruz.

Thread için Buffer; yoksa Builder daha iyi.

 

Struct : Aralarında mantıksal bir ilişki bulunan farklı türden bilgilerin mantıksal bir bütün olarak ifade edilmesidir.

Class ile Struct arasındaki fark sınıflar referans türünde yapılırken yapılar ise değer türündendir. Yapılar stack, sınıflar heap. Sınıflara referans aracılığıyla yığınlara doğrudan ulaşabiliriz.

OOP Kavramları

Abstract Class :  Abstract kalıtımı zorunlu kıldığı için tercih edilmiyor. Soyut yöntem demek alt sınıfta tekrar tanımlanması zorunlu yöntemdir. Ancak yöntemler soyut olur. Soyut sınıflarda

Override: Türetildiği sınıftaki metodu ezmek.

Overload : Aynı isimli farklı parametre sayılı metodlar.

Encapsulation : Dış etkilerden koruma Oluşturduğumuz metod, sınıflama erişimleri sınırlandırır. Burada public, protected, private, default(internal)

Nested(Gömülü) Class : Bir sınıf içerisinde başka bir sınıfın tanımlanmasıdır. Statik ve statik olmayan diye 2’ye ayrılır.

Faydaları: Sınıfların mantıksal gruplanması, Daha iyi encapsulation, kod okunabilirliği

Inner Class: Static olmayan nested classlardır.

Constructor 

Interface(CAN DO)’larda metodların içerisini doldurmayız. Abstracta doldururuz ve bütün alt sınıflarda aynı özellikler olur.

Interface ile yapabileceğimiz herşeyi abstract class ile de yapabiliriz.

Alt sınıflarda default özellik isteniyorsa abstract class mantıklı. Ayrıca hız açısından da iyidir. Interface’de kaç sınıf implement etsek o kadar metodu yazmamız lazım.

ViewState : Verileri saklamak için default olarak kullanılan teknik. Sayfa post back olduğunda ve geri geldiğinde aynı sayfadaki değerlerin saklanması işlemidir.

Get/Post : İstekte bulunurken get adres satırında görünür. post görünmez. Post yavaştır. get veri çekmek ; post veriyi düzenlemek için

Clustered Index: Unique

UnClustered Index : Adresleme

 

Javascript Kuralları, Design Patterns

 

 

MVC’ye Giriş ve Proje Oluşturma

MVC(Model-View-Controller), ilk olarak 1979 yılında  Trygve Reenskaug tarafından tanımlandıktan sonra yazılım alanında kullanılmaya başlayan önemli bir mimari patern(architectural pattern)’dir.  Microsoft 2007 yılında ASP.Net MVC ‘yi tanımlanmış ve 2009 yılında MVC 1.0 yayınlanmıştır

MVC tasarım mimarisinde sayfa ve veri tabanı ayrı katmanlarda yer alır ve arasındaki bağlantı controllerda’ki sınıflar üzerinden yapılır.

MVC’de bir uygulamanın kullanıcı arayüzü 3 ana bölüme ayrılır:

  • Model: Tablo ve Tablolar arası ilişkilerin tanımlandığı katmandır. Tablolar class’lar oluşturularak tanımlanır. Bu katman database’a erişimini sağlar. Database erişim yolları ve metotlarımız yer alır. Data Erişim katmanı olarak Entity Frameework,Nhibernate gibi Frameworkler ile çalışılabilir.  –access layer –
  • View: Son kullanıcının gördüğü arayüzdür. Kodsal olarak düşündüğümüzde html taglerinin generate edilip sayfanın oluşturulduğu kısımdır. MVC ile birlikte view’ların oluşması Controller’daki ilgili class’tan View’ın return olması gerekmektedir. Karışık olduysa şu şekilde sadeleştreyim. Bir View’ın browser’da çalışabilmesi için Controller’da bir aynı isimli bir sınıfın olması gerekir.
  • Controller: Kullanıcı arayüzündeki işlemler ile veri tabloları ve/veya spesifik katman arasındaki bağlantı ve işlemlerin yapıldığı katmandır. Kullanıcının View’daki işlemlerinin karşılanıp model ile iletişimin sağlandığı katmandır. Hangi View’ın render edileceği burada belirtilir. View’lar Controllerdan çağrılır.
  • MVC bir framework olmasının yanında özellikle bir tasarım kalıbı –mimari-dir. Object-Oriented bir dil olmasa da classlar arası hiyerarşi ve implement edilebilir bir yapı vardır. MVC mimarisi bir çok dilde kullanılabilir.

MVC ile bir proje oluşturalım 

Visual Studio’da File -> New -> Project > Sağ kısımdaki Web alanı tıklandığında gelen projeler arasında ASP.Net MVC 4 Application seçilir.

Capture

Projenizin ismini girdikten sonra browse diyerek projenin bilgisayarınızda hangi klasöre kaydedileceğini belirtiniz. Solution bölümünde projenizi varolan bir solution’a ekleyebilirsiniz ya da yeni bir solution’da açabilirsiniz.

OK dedikten sonra yeni pencerede projenize dair seçenekler çıkacaktır.

Capture

Project Template’de bize 8 farklı template sunulur:

Empty

Uygulamanın çalışması için gerekli minimum klasör ve dosyayı içeren template’dir. Controller başta olmak üzere UnitTest gibi diğer tüm her şeyi kendimiz oluşturmalıyız.

Basic

Empty’ye ek olarak Content,Scripts ve Shared gibi bir kaç dosyanın da yüklü geldiği proje template’dir.

Internet Application

Form authentication kullanan bir account controller’ı default eklenmiş şekilde hazırlanmış projedir.

Intranet Application

Default olarak Windows Authentication kullanıp Account\Home\Shared Viewlerini barındıran proje template’dir.

Mobile Application 

Mobil uyumlu uygulamalar için kullanılan, jquery Mobile javascript Framework’ü içinde barındıran templatedir.

View Engine

View’da yazdığımız HTML sayfalarının render etmek için hangi View Engine’i seçtiğimiz kısımdır. View’ların HTML çıktısı olarak render edilmesi için kullanılan yapıdır. Browser HTML olarak bu Viewları algılar.  View Engine translates view into HTML

View Engine : Sunucu taraflı kodların View’ların içerisine gömüldüğü  (C#, Vb.Net gibi) – client’a gönderilmeden işlenen-  görüntüleme ve işleme motorudur.

MVC’de kullanabileceğiniz View Engine’lar:

  • Web Forms(View Engine)
  • Razor

Bunların dışında üçüncü parti ViewEngine’lar da vardır.

MVC ‘nin güzelliklerinden olan Razor’dan kısaca bahsedecek olursam ;

MVC3 ile birlikte gelen Razor  söz dizimi HTML kodunu C# koduna çevrilmesini sağlar. Razor’da önce MVC’de default kullanılan View Engine Web Forms View Engine idi. Ancak yazımı, kullanımı ve bakımı oldukça zor ve karmaşıktı. Yazımı kolaydır (@)  Razor ile yazılan sayfaların uzantıları C#’da .cshtml Basic’de ise .vbhtml olmaktadır.Razor karakteri @ sembolüdür. View’da @ işareti görüldüğünde bu işlemin sunucu tarafında yapılması gerektiğini algılar.  Razor View Engine’da  sunucu taraflı kod yazdığımızda sayfa browser’a gitmeden sunucyla ilgili kısımları yapar ve bu işlemleri bitirdikten sonra html içeriği üretilip browsera gönderilir. (Controllerda yapılan işlemler)  Tarayıcı, sunucuda yapılan işlemleri görmez. Razor’un avantajı öğrenmesi kolay, kısa\özlü ve akıcı bir yazılımın olması , text editörden bağımsızlığı ve viewda debug ile test edilebiliyor olmasıdır.

Bu bilgilerle ilk MVC projemizi oluşturabiliriz.

MVC ViewData, ViewBag ve TempData ifadeleri

Bazı bilgileri kullanmak için Asp.Nette Session  nesnesi kullanılır. Mvc’de Session yerine ViewData ve ViewBag nesneleri kullanılır. Controller ile View sayfaları arasındaki  iletişimi sağlarlar. Runtime esnasında çalışır. Asp.Net te formumuza verileri aspx.cs üzerinden getiriyorduk. MVC’de bunun için viewbag, viewdata ve tempdata kullanılır.   ViewData MVC 2 de ViewBag ise MVC 3 de eklenmiştir.

ViewData: Veri Controller sınıfından View sayfalarına ViewDataDictionary (ViewData) sınıfı ile taşınır. ViewData nesnesine controller sayfalarında beslediğimiz verileri view sayfalarında okuyabiliriz.

ViewData[“Title”] = “Software Engineer”;

ViewBag: ViewBag ise MVC 3’te dynamic keyword’unun gelmesi ile gelen bir yeniliktir. ViewData’nın dinamik (run time binding) halidir. Söz dizimi olarak farklı ve daha kolaydır.

ViewBag.Title =”Software Engineer”;

İkisi de aynı işlevi görmekle beraber aralarında çalışma zamanı ve syntax olarak birbirinden farklıdır.

TempData: TempData’da ViewBag ve ViewData ile aynı görevi yapar. Syntax’ı viewdata ile aynıdır.

Bu üç nesne arasında küçük ve kritik farklar vardır. Örneğin ViewBag nesnesi dynamic tipinde bir nesne olduğundan bununla alakalı hatalar compile time da değil run time da yakalanır. Teknik anlamda ViewData nesnesinden farkı yoktur. Söz dizim olarak farklıdır.En büyük ve önemli fark TempData ile diğer ikisi arasındadır. ViewData ve ViewBag nesnesi o anki HTTP istek içerisinde geçerlidir. Yaşam döngüsü bir sonraki isteğe kadardır. Ama TempData bir alt HTTP istek içinde geçerlidir. Yaşam döngüsü o anki ve bir sonraki HTTP istek içerinde geçerlidir.

İki nesne için bir örnek yapalım .

Controller klasöründe viewdata ve viewbaglerimizi oluşturuyoruz.

public ActionResult Index()

{

ViewBag.Title=”Software Engineer”;

ViewData[“Title1″]=”Software Engineer”;

TempData[“Title2″]=”Software Engineer”;

return View();

}

Daha sonra view sayfamızdan datalarımızı okuruz.

<h2>@ViewBag.Title </h2>

<h2>@ ViewData.[“Title1”]=”</h2>

<h2>@ TempData.[“Title2”]=”</h2>