Sözlük

5 Mayıs 2015 Salı

İbrahim Atay ASP.Net MVC Öğreniyorum Maceram

İbrahim Atay'ın hazırladığı MVC Eğitim videoları...


 “ASP.Net MVC Öğreniyorum” serisi 19 video,20 blog içeriği ve bir uygulama projesinde oluşmaktadır.
ASP.Net MVC Öğreniyorum video serisi sürecinde ASP.Net MVC 2  ve 3 sürümlerin geçiş dönemine gelmesi, ASP.Net MVC 3 bilgilerimi anlatabileceğim ASP.NET MVC 3 RC Sürümüne Bakış internet seminerinin temellerini oluşturmuştur. Aşağıda ASP.NET MVC 3 RC Sürümüne Bakışinternet semineri ile ilgili metrayeller ilgili bağlantılar bulunmaktadır.
Video kayıt / http://bit.ly/ASPNetMVC3WebinerVideo
İnternet Semineri sunumu / http://bit.ly/ASPNetMVC3RCWebiner
uygulama kaynak kodları / http://bit.ly/ASPNetMVC3Samples

Kaynak

C# İle Generic List ve DataTable

Herhangi bir veritabanından çektiğimiz verileri işlerken ya da görüntülerken Veri Kaynağı Konfigrasyon Sihirbazı (Data Source Configuration Wizard) kullanmadan veriyi bir class ile modelleyerek ilgili data kontrolüne (GridView, Repeater vb.) kod tarafında bağlamak isteyebiliriz. Veriyi bir class ile modelleyerek kullanmak iş yükünü ve sürecini uzatır ama bize daha fazla hareket alanı ve kontrol sağlar. Teknik olarak bu bir zorunluluk değildir ancak veriyi bu şekilde işlerkenSqlDataAdapter yerine SqlDataReader kullanmamız performans anlamında özellikle veri yükümüz arttığında bir hayli performans artışı sağlar.
Class ile modellediğimiz veriyi bir Generic List ‘e atayıp GridView, ListView, ListBox, CheckBoxListvs.. gibi kontrollerden birine bağlayabiliriz. Ancak bazen Generic List’e atanmış bu veriyi DataTable‘a dönüştürme ihtiyacı duyabiliriz. Mesela şuradaki yazımda bahsettiğim örnekte olduğu gibi metodun parametre olarak bir DataTable istediği durumlarda bu dönüşümü yapacak bir class/metod işimize yarayacaktır. Şimdi basitçe bunu nasıl yapılacağını göreceğiz. Bir örnek senaryo üzerinden gidelim:
Veritabanımızda Kisiler isminde bir tablomuz var. Bu tablodan çekeceğimiz veriyi modelleyeceğimiz class’ımız:
public class KisilerDM;
{
public string Ad { get; set; }
public string Soyad { get; set; }
public string Adres { get; set; }
public string Telefon { get; set; }
public string Email { get; set; }
public KisilerDM(string Ad, string Soyad, string Adres, string Telefon, string Email)
{
this.Ad = Ad;
this.Soyad = Soyad;
this.Adres = Adres;
this.Telefon = Telefon;
this.Email = Email;
} }
Şimde de verimizi SqlDataReader ile çekerek bu class üzerinden modelleyelim:
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
public class Kisiler
{
public Kisiler()
{
}
public static List KisileriGetir()
{
List kisiler = new List();
SqlConnection Conn = new SqlConnection();
Conn.ConnectionString = "";
Conn.Open();
SqlCommand Cmd = new SqlCommand("SELECT Ad, Soyad, Adres, Telefon, Email FROM Kisiler", Conn);
Cmd.CommandType = CommandType.Text;
Cmd.Parameters.Add("@Ad", SqlDbType.NVarChar);
Cmd.Parameters.Add("@Soyad", SqlDbType.NVarChar);
Cmd.Parameters.Add("@Adres", SqlDbType.NVarChar);
Cmd.Parameters.Add("@Telefon", SqlDbType.NVarChar);
Cmd.Parameters.Add("@Email", SqlDbType.NVarChar);
SqlDataReader dr = Cmd.ExecuteReader(CommandBehavior.CloseConnection);
while (dr.Read())
{
kisiler.Add(new KisilerDM(
// veri null döndüğünde hata almamak için aşağıdaki gibi
// conditional operator (?:) kullandık.
dr.IsDBNull(0) ? String.Empty : dr.GetString(0), // Ad
dr.IsDBNull(1) ? String.Empty : dr.GetString(1), // Soyad
dr.IsDBNull(2) ? String.Empty : dr.GetString(2), // Adres
dr.IsDBNull(3) ? String.Empty : dr.GetString(3), // Telefon
dr.IsDBNull(4) ? String.Empty : dr.GetString(4) // Email
));
}
dr.Close();
return kisiler;
}
}
Artık yukarıdaki metodumuz bize verilerimizden oluşan bir generic list döndürüyor. Bu generic list’i bize DataTable olarak döndürecek class ve metodlarımız:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
public class MyData
{
// bu metotla dönüştürmeyi yapılacak
public static DataTable ConvertGenericListToDataTable(IList list)
{
DataTable dt = CreateTable();
Type entityType = typeof(T);
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(entityType);
foreach (T item in list)
{
DataRow dr = dt.NewRow();
foreach (PropertyDescriptor property in properties)
{
dr[property.Name] = property.GetValue(item);
}
dt.Rows.Add(dr);
}
return dt;
}

private static DataTable CreateTable()
{
Type entityType = typeof(T);
DataTable dt = new DataTable(entityType.Name);
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(entityType);
foreach (PropertyDescriptor property in properties)
{
dt.Columns.Add(property.Name, property.PropertyType);
}
return dt;
}
}
Örnek kullanım:
List liste = KisileriGetir();
DataTable MyDataTable = MyData.ConvertGenericListToDataTable(liste);

Kaynak

Web.config İle Uygulama Ayarlarını Class Üzerinden Daha Etkin Kullanmak

Asp.NET projelerimizin olmazsa olmazı -ki olmazsa uygulama çalışmaz :)- web.config dosyamızda <appSettings> düğümü içerisinde uygulamada kullanmak üzere bir çok anahtar tanımlarız. Bunları tıpkı bir class içindeki property’ler gibi etkin kullanabilmek adına kendi projelerimde kullanmak için bir pratik bir yöntem geliştirdim ve paylaşmak istedim. Adım adım nasıl yapılacağını görelim:
Yeni bir “Asp.NET Web Site” oluşturuyoruz. Projemizi bir kez F5 ile Debug ediyoruz ki web.configdosyamdaki girdiler VWD ya da VS tarafından güncellensin. Öncelikle aşağıdaki ekran görüntüsünde de görüldüğü üzere sitemize uygulama ayarları için web.config‘den bağımsız olarak farklı bir “Web Configuration File” dosyası oluşturup ekliyoruz. Bu dosyaya ben “appSettings.config” adını veriyorum ve “App_Data” klasörüne kaydediyorum. Bu klasöre kaydetmek zorunlu değil. Ancak hostta bu klasör varsayılan olarak yazma iznine sahip olduğu için host’a yüklediğimde tekrar yazma izinleri ile uğraşmak zorunda kalmayacağım için tercihimi bu yönde kullandım.
app.Settings.config dosyasını oluşturma
Web.config İle Uygulama Ayarlarını Class Üzerinden Daha Etkin Kullanmak
Yukarıdaki resimde sağ tarafta oluşturduğumuz yeni konfigrasyon dosyasının içeriği görünmekte. Burada en üstteki <?xml version="1.0"?> satırı hariç diğer satırları silip onun yerine aşağıdaki gibi<appSettings></appSettings> düğümünü ekliyoruz. Ayarlarımızı bu düğümler içerisine yazacağız. Örnek olarak aşağıdaki resimde de görüldüğü gibi iki adet anahtarımız var.
Web.config İle Uygulama Ayarlarını Class Üzerinden Daha Etkin Kullanmak
Şimdi web.config dosyamızda yeni oluşturduğumuz bu dosyanın yolunu <configuration>düğümünün hemen altında aşağıdaki biçimde tanımlıyoruz:

Şimdi projemize bir “App_Code” klasörü ekleyip uygulamamız içinden bu değerlere pratik bir biçimde erişebileceğimiz, güncelleyebileceğimiz class’larımızı yazmaya başlayabiliriz. İlk class’ımızbizim ayarları güncelleyebileceğimiz metodumuzu barındıran SettingsBase isimli class’ımız olacak. Bu class’ı SettingsBase.cs isimli dosya adı ile oluşturuyoruz.
Web.config İle Uygulama Ayarlarını Class Üzerinden Daha Etkin Kullanmak

SettingBase.cs dosyası içeriği:

Buradaki SaveSetting metodunu bilinçli olarak static tanımladım. Böylece class’ın yeni bir instance’ını oluşturmak zorunda kalmadan değeri set edebiliriz. Ayrıca appSettings.configdosyanızı App_Data dışında bir klasöre kaydettiyseniz, metot içindeki string baseDir = System.Web.HttpContext.Current.Server.MapPath(“~/App_Data/”); satırını da ona göre değiştirmelisiniz.
Şimdi ise Settings isimli ayarlarımızın property’lerinin bulunacağı class’ımızı Settings.cs dosya adıyla oluşturacağız. Ve class’ı da SettingsBase isimli class’ımızdan türeteceğiz ki oradakiSaveSetting metodunu kullanabilelim.
Setting.cs dosyası içeriği:
Web.config İle Uygulama Ayarlarını Class Üzerinden Daha Etkin Kullanmak
Artık ayarlarımızı class’ımız üzerinden get/set edebiliriz. Örnek olarak sitemizin ana sayfasının browser başlığını bu class içindeki property’den alalım. Bunun için Page_Load event’i içinde aşağıdaki kodu yazmamız yeterli olacaktır:

Web.config İle Uygulama Ayarlarını Class Üzerinden Daha Etkin Kullanmak
Sonuç olarak aşağıda görüldüğü gibi browser’ımızın başlığı bizim appSettings.config içinde tanımladığımız değer oldu. Aynı şekilde asp.net sayfamız içindeki bir kontrole ya da kodumuz içindeki herhangi bir string değişkene de atayabiliriz.
Bir de tanımladığımız bir değeri değiştirmeyi deneyelim. Mesela browser başlığını değiştirelim. Bunun için aşağıdaki kod bloğunu çalıştıralım:

İşte appSettings.config içindeki “SiteTitle” anahtarımızın değeri:
Web.config İle Uygulama Ayarlarını Class Üzerinden Daha Etkin Kullanmak
Görüldüğü gibi Settings class’ımızdaki property üzerinden hem get hem de set işlemini pratik bir biçimde yapabiliyoruz. Siz kendi projelerinizdeki ihtiyaçlara göre bu class’ı geliştirebilirsiniz. Mesela Int32 türünde değer alan property’ler için set bloğunda bir TryParse denetimi ile tam sayı (integer) olmayan değerlerin kaydedilmesini engelleyebilirsiniz.

Kaynak