Kategori arşivi: ASP.NET

Çok Katmanlı Mimari (NLayered)

MVC’ye geçiş yaptığım dönemden bu yana Model, View ve Controller katmanları gördükçe kodlarım nedense bana çok karmaşık gelmeye başladı. Kendi kuruntum herhalde dedim ama biraz araştırma yaptıktan sonra analar ne developer doğuruyor demekten kendimi alamadım 🙂

Çok katmanlı mimarı hakkında Microsoft’un best practicelerini incelemenizi tavsiye ederim. Veritabanı işlemleri yapıldığı DAL (Data Access Layer), arayüz ile veritabanı arasındaki işleri yapan BLL (Business Logic Layer) katmanlar hakkında http://msdn.microsoft.com/en-us/library/aa581776.aspx (DAL) ve http://msdn.microsoft.com/en-us/library/aa581779.aspx (BLL) sayfalarını incelemenizi tavsiye ederim.

Bunlar haricinde katmanlar arası veri akışı sağlayabileceğiniz Entities, kendi helperlarınızı tutabileceğiniz Utilities ve verilerinizi dışarıya açmak için Service katmanlarıda oluşturabilirsiniz.

Bu mimari uygulama sürecin uzatsada yapınız mükemmel şekilde hiyerarşik ve modüler hale geliyor. Hele ki takım çalışması olan uygulamalarınız için size kolaylıklar sunuyor.

Katmanlı mimariyi anladıktan sonra, kendimi biraz daha Yazılım Geliştirici olduğumu hissetmeye başladım 🙂

Html.BeginForm’u Post Sonrasında Js ve JQuery İşlemleri

Üzerinde çalıştığım projemde dosya yükleme eklemem gerekiyordu. Bütün view’lerimde Ajax.BeginForm ile post ediyordum ve post sonrası js işlemleri için parametre olak OnSuccess kullanıyordum. Upload işlemini Html.BeginForm ile yapmak zorunda kalınca OnSuccess’den mahrum kaldım.

Html.BeginForm ile post sonrasında js kütüphanelerimi aşağıdaki gibi bir yöntemle çalıştırdım 🙂

JS Kütüphanesi:

function querystring(key) {
    var re = new RegExp('(?:\\?|&)' + key + '=(.*?)(?=&|$)', 'gi');
    var r = [], m;
    while ((m = re.exec(document.location.search)) != null) r.push(m[1]);
    return r;
}

$(document).ready(function () { 
    if (querystring('i') == "FRAME_CLOSE") {
        alert("Başarıyla eklenmiştir.");
        parent.jQuery.fn.colorbox.close();
    }
    else if (querystring('i') == "DOSYA_BOYUT") {
        alert("Dosya boyutu en fazla 10 MB olabilir.");
    }
    else if (querystring('i') == "DOSYA_TIP") {
        alert("İzin verilen dosya formatları: *.jpg, *.pdf, *.doc, *.docx, *.xls, *.xlsx, *.udf");
    }
    else if (querystring('i') == "DOSYA_YOK") {
        alert("Lütfen yüklemek istediğiniz dosyayı seçiniz.");
    }
    else if (querystring('i') == "HATA") {
        alert("Lütfen formu kontrol ediniz.");
    }
    else if (querystring('i') == "WEB_HATA") {
        alert("Beklenmedik bir hata oluştu. Lütfen tekrar deneyiniz.");
    }
});

Controller.cs:

[HttpPost]
public ActionResult FileUpload(int id)
{
     try
     {
         return Redirect("/Muvekkil/EvrakYeni?i=FRAME_CLOSE");
     }
     catch (Exception ex)
     {
         return Redirect("/Muvekkil/EvrakYeni?i=WEB_HATA");
     }
}

HttpContext.Session Özelliği

Bilişim kariyerimdeki yazılım geliştirme ile uğraştığım senelere bakacak olursak, her halde en bıkmış olduğum olduğum konu sessionlardır.

Ne zaman üyelik sistemi veya session ihtiyaç duyduğum bir uygulama üzerinde uğraşsam beni bir huzursuzluk kaplıyor 🙂 Yıllardır bu bende tramva olarak sürer ve en sonunda bununla ilgili birşeyler yazıp içimi dökmek istedim.

Her yazılımcının bildiği gibi HttpContext.Session özelliği kullanımı üç başlık altında özetleyebiliriz. Uygulamaları olarak gideceğimiz için ilk önce string tipindeki değişkenlerimizi oluşturuyoruz.

string _ad = "Hüseyin";
string _soyad = "Yıldırım";
string _sehir = "Manisa";

Sessionlarımıza değişkenlerimizi kayıt ediyoruz.

Session["ad"] = _ad;
Session["soyad"] = _soyad;
Session["sehir"] = _sehir;

Sessionlarımızdaki değeri okuyoruz.

_ad = (string)(Session["ad"]);
_soyad = (string)(Session["soyad"]);
_sehir = (string)(Session["sehir"]);

Web Form sınıfı dışında ise böyle kullanıyoruz.

HttpContext context = HttpContext.Current;
context.Session["ad"] = _ad;
_ad = (string)(context.Session["ad"]);

Teoride her şey ne kadar kolay ama uygulamada hatam nerede yaaa ama bulacağım sorunu 😉

Entity Framework An error occurred while updating the entries. See the inner exception for details.

Ana tablonuzdaki ID ile referans tablonuzda ilişkilendirdiğiniz alanın; değerlerinin birbirinden farklı olmasından kaynaklanan hatadır.

Örnek vermek gerekirse aşağıdaki gibi tablo yapımız var. TBL_KULLANICI tablomuzdaki Id ile TBL_KULLANICI_YETKI tablomuzdaki Kullanici_Id birbiri ile ilişkilidir.

TBL_KULLANICI (Id, Ad)
TBL_KULLANICI_YETKI (Id, Kullanici_Id, Baslik)

Eğer TBL_KULLANICI tablosuna yeni kayıt eklerken aynı anda TBL_KULLANICI_YETKI tablosunada yeni kayıt ile alakı kayıt ekliyorsak; Id ile Kullanici_Id aynı değer olmak zorundadır. Farklı değer olduğunda bu hata ile karşılaşırsınız.

TCMB’dan XML ile döviz kuru çekmek

public static void DovizKurAl()
{
XDocument TCMB = XDocument.Load("http://www.tcmb.gov.tr/kurlar/today.xml");
if (TCMB != null)
{
var Kur = (from p in TCMB.Element("Tarih_Date").Elements("Currency")
select new
{
tarih = (string)TCMB.Element("Tarih_Date").Attribute("Tarih"),
kod = (string)p.Attribute("Kod"),
isim = (string)p.Element("Isim"),
alis = (string)p.Element("ForexBuying"),
satis = (string)p.Element("ForexSelling"),
efektifalis = (string)p.Element("BanknoteBuying"),
efektifsatis = (string)p.Element("BanknoteSelling")
});
if (Kur.AsEnumerable().Count() > 0)
{
foreach (var item in Kur)
{
HttpContext.Current.Response.Write(item.tarih + " / " + item.kod + " / " + item.isim + " / " + item.alis + " / " + item.satis + " / " + item.efektifalis + " / " + item.efektifsatis + "
");
}
}
}
}