ASP.NET MVC Url Routing ve GoDaddy'de Site Barındıranların Yapması Gereken Url Routing Ayarı

by emrekayikcilar 09.02.2009 11:49:00

MVC Frameworklerin hepsinde Url Routing işlemini sistemin belkemiği olarak nitelendirebiliriz. Çünkü en başta kullanıcı açısından url adreslerinin temiz ve akılda kalır olması ve ayrıca adreslerin arama motorları tarafından daha rahat indekslenmesi için çok önemlidir. Diğer yandan web geliştirici aklından geçenleri tam olarak siteyi programlarken siteye aktarabilir. Örneğin HomeController Classının içine yazdığı bir methodun ismini özenle seçen bir programcı aynı isimle Views içine bir ASP.NET View dosyası koyar ve daha sonra Url'nin de bu şekilde olacağını ilk anda aklında canlandırdığında daha hızlı kararlar vererek düşündüklerini daha hızlı koda aktarabilir. Tabii ki bunlar tamamen ben MVC ile çalışırken edindiğim kendi izlenimlerim. Bu anlattıklarım normal ASP.NET uygulamaları için geçerli değilmi dir? Çoğu aslında onlar içinde geçerlidir. Fakat MVC yapısındaki Controller Classının methodu Views içinde View'lara denk gelir mantığı normal ASP.NET uygulamalarından çok farklı bir yapıdır. Bu şekilde kodlamasını yapan bir geliştirici dizayn kısmında neler olacağını aynı zamanda tasarlayabilir.

Şimdi neden ilk paragrafta müthiş anlatım tekniğim(!) ile bunlardan bahsettim. Çünkü girilen url adresinin Controllerdaki hangi Action Methoda denk geldiği ve Controller'ın hangi view'u kullanıcıya göndereceği Url Routing ile alakalıdır. Ayrıca Url Routing sayesinde ileride uygulamamızın URL yapısını değiştirdiğimizde bize çok yardımcı olacaktır. Böyle bir işlem yapmamız gerektiğinde Controller Class'ındaki methodlarda değişiklik yapmadan sadece Application seviyesindeki ilgili routing(mapping) kurallarını değiştirmemiz yeterli olur.

ASP.NET MVC ve URL Routing arasında bulunan ilişkiyi anlattıktan sonra ASP.NET MVC ' nin beta düzeyde; fakat RC(Release Candidate - Kararlı Sürüm Olmaya Aday) olduğunu hatırlatmak isterim. Yani çoğu hosting firması belki de şu an karalı sürüm olarak çıkmasını beklediğinden ASP.NET MVC ' ye destek vermemektedir. GoDaddy ' de shared hosting'te bu MVC routing desteği vermeyenlerden biri. Bunu localhost'ta çalışan bir MVC uygulamasını remote hosta atarken farkettim. En başta anasayfa geliyor aslında tabii burada uygulama default.aspx sayfasını IIS Server'a MVC uygulamasını başlatıldığını belirtmek için kullanıyor. Zaten işler bundan sonra ters gidiyor. Çünkü normal olarak URL'de uzantı arayan IIS Server /Home/CreateNew gibi sade MVC URL ' lerini görünce aşağıdaki hatayı verdi.

The system cannot find the file specified.

Yukarıda da belirtildiği gibi ilk olarak default.aspx(application root sayfası) yüklendiğinden ve IIS sorun çıkarmıyor; fakat sayfadaki herhangi bir URL'ye tıklandığında Routing yapılan adreste uzantı olmadığından IIS böyle bir sayfa olmadığını söyleyerek hatayı ekrana basıyor. Peki bu sorun nasıl çözülecek.

Aslında bu sorunun çözülmesi tam anlamıyla MVC olmayan uzantı barındıran URL lere yönlendirme yaparak çözülür. Burada URL routing ayarlamaları karşımıza çıkar. Bu ayarlamalar ise; ASP.NET programcılarının yakından tanıdığı Global.asax dosyasında yapılır. Dosyanın default olarak yapısı şu şekildedir:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
 
namespace MVCTaskList
{
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801
 
    public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.MapRoute(
                "Default",
                "{controller}/{action}/{id}",
                new { controller = "Home", action = "Index", id = "" }
            );
        }
 
        protected void Application_Start()
        {
            RegisterRoutes(RouteTable.Routes);
        }
    }
}

Bu dosya normal ASP.NET dosyalarında bütün uygulamayı ilgilendiren işlemleri barındırır.(Uygulama başlarken ya da biterken yapmak istediğimiz işlemler varsa; bu dosyadaki Application_Start ve Application_End eventlerini kullanırız.) Zaten diğer adı da ASP.NET Application File olarak geçer. Bu dosya uygulamanın root dizininde olmalıdır. Bu dosya ASP.NET MVC de ise; daha önemli bir yere sahiptir; çünkü yukarıda anlattığımız çok önemli URL Routing işlemlerini bu dosyayı kullanarak yaparız.

Örneğin yukarıdaki kod parçasında Application_Start event'i ve yardımcı bir method(RegisterRoutes) bulunur. Öncelikle Application_Start event ' i yüklenir ve daha sonra yardımcı method çalışır. Routing işini yapan bu methodtaki routes.MapRoute fonksiyonudur. Bu fonksiyonu kısaca açıklayalım:

  • "Default" parametresi Route adıdır ve bu route'u diğer routelardan ayırmaya yarar.
  • İkinci parametre URL'nin yapısının nasıl olacağını belirler. Önceklikle Controller adı sonra Controller'da bulunan bir action adı ve daha sonra ise; parametre olarak bir id kullanılr.
  • Üçüncü ve son parametrede ise; ikincide belirlenen elemanların default değerleri verilir. Buna göre default Controller "HomeController", bu controller'da bulunan "Index" action methodu default method olur. Default id değeri ise; boştur yani değeri yoktur.

Buradan yola çıkarak /Home/Index, /Home/Create,  /Home/Task/1 gibi URLler uygulama içinde var olabilir. Fakat bu tür bir Routing GoDaddy'de şu için çalışmamaktadır. En azından benim sitemi barındırdığım shared hosting hesabımda çalışmıyor. Bunun nedeni de yukarıda belirtildiği gibi IIS ' in URL'de uzantı aramasından kaynaklanır. Eğer Global.asax şu değişikliği yaparsak sorun çözülmüş olur.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
 
namespace MVCTaskList
{
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801
 
    public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
 
            // Routing for Godaddy :)
            routes.MapRoute(
                "Task",
                "{controller}.aspx/{action}/{id}",
                new { controller = "Home", action = "Index", id = "" }
            );
        }
 
        protected void Application_Start()
        {
            RegisterRoutes(RouteTable.Routes);
        }
    }
}

Burada düzeltme ile Routing yapılırken Server Controller'a baktığından ve Controller'da .aspx uzantısı olduğundan sorun çıkarmaz. Daha sonraki yönlendirmede ise; istenen action'a gidilir ve action'a bağlı olan View çağırılır. Tabii ki bu şekilde oluşturulmuş bir URL asıl MVC mantığına uymamaktadır. Şu an sadece uygulamayı çalıştırmak için bu şekilde bir routing ifadesi yazılmalıdır. Örnek olsun diye buradaki TaskList örneğinin C# versiyonunu yaptım ve GoDaddy'de host edilen alanıma yükleim. Uygulamayı buradan deneyebilirsiniz. Burada tek yanlış yapılabilecek durum sayfalaradaki normal linklerin ya da formların action attributelerinin gittiği linklerin yanlış oluşturulabilmesidir. Bu linklerin elle veya Html Helper Methodları kullanarak oluşturmayı sonraki yazılarda göreceğiz. Bu yazının beklediğimden daha uzun olması beni bu yola sevk etti:)

Yukarıda verdiğim bilgiler umarım yine bir GoDaddy kullanan arkadaşa yardımcı olmuştur.

Bu yazıyı ilk değerlendiren siz olun

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: ,

ASP.NET MVC | GoDaddy

GoDaddy'de Barındırılan Bir BlogEngine.Net Blogunda Contact.aspx Sayfasındaki Formdan Mail Gönderilebilmesi

by emrekayikcilar 08.02.2009 14:47:00

GoDaddy shared hosting hesabımda barındırdığım 1.3.1 versiyonlu BlogEngine.Net blogumda en baştan beri doğru çalıştıramadığım Contact maili gönderme formuna çoktandır işlevini kazandırmaya çalışıyordum. SMTP Relay olarak Gmail ve GoDaddy'nin adreslerinin deniyordum. Fakat ikisinde de sorunlar çıkıyordu. Gmail kullanmaya çalışırken daha önceden bir Contact form kodunu .Net'te yazmıştım ve gmail üzerinden mail gönderebilmiştim. Bu kodu buldum ve aynı ayarları BlogEngine.Net ayarlar kısmındaki Email kısmına girdim. Girdiğim ayarlar şu şekilde:

  • E-mail adresi: gmail adresim
  • SMTP Server: smtp.gmail.com
  • Port: 25
  • Kullanıcı Adı: Gmail Kullanıcı adım (@gmail.com sonuna eklenerek)
  • Şifre: Gmail şifrem
  • SSL Etkinleştirdim (Gmail dilinde Use STARTTLS deniyor.)

Yukarıdaki ayarlar başarısız oldu. Bazı arkadaşlar yukarıdaki port numarasını görünce "Arkadaşım yanlış portu kullanıyosun ondan oluyor.", diyecekler; ama durum öyle değil. Örneğin şuradan gördüğüm ayarları da denedim.

  • E-mail adresi: gmail adresim
  • SMTP Server: smtp.gmail.com
  • Port: 465 veya 587
  • Kullanıcı Adı: Gmail Kullanıcı adım (@gmail.com sonuna eklenerek)
  • Şifre: Gmail şifrem
  • SSL Etkinleştirdim (Gmail dilinde Use STARTTLS deniyor.)

Yukarıdaki ayarlar da başarısız olduktan sonra nette yaptığım diğer araştırmalarda. GoDaddy'de sitesini shared hosting altında host ettiren insanların da aynı derdi olduğunu gördüğümde biraz rahatlamadım değil:)  Gmail smtp relay servisini kullanmaya çalışanların çoğu GoDaddy'nin kendi smtp relay servisini kullanınca sorunun çözüldüğünü belirtmişler. Ayrıca belirtmek lazım bu kullanıcılar da aşağıdaki gmail portlarını kullanmayı denemişlerdi; fakat başarılı olamamışlardı. Benim ilk aklıma gelen GoDaddy Server'larından kaynaklanan bir sorun olabileceğiydi. Bununla ilgili GoDaddy'nin sitesindeki Support ve Help bölümlerinden yaptığım aramalarda bununla ilglili bir açıklamaya rastlayamadım ya da benim arama metnim yetersiz kalmıştı:)  Daha sonra nette karşılaştığım ve GoDaddy için verilen smtp ayarlarını kendim uyguladım. Bu ayarlar:

  • E-mail adresi: GoDaddy'deki host ettiğim siteye ait mail hesabım
  • SMTP Server: relay-hosting.secureserver.net
  • Port: 25
  • Kullanıcı Adı: - (Boş bırakıldı)
  • Şifre: - (Boş bırakıldı)
  • SSL Etkinleştirmedim

Bu ayarlarla test Emailinin başarılı olduğunu gördüğümde bayağı bir şaşırdım. Demek ki sorun godaddy kaynaklı olabilirdi ve smtp relay için sadece bu adresi kabul ediyor, olabilirdi. Ben de bu ayarlar başarılı olduğundan bu ayarlar ile devam etmeye karar verdim ve Contact sayfasındaki formdan bir deneme maili göndereyim, dedim. Önce kafadan attığım bir mail hesabı ile (domain falan da sallamaydı) göndermeyi denedim ve Godaddy'den mailin InBox'ına baktığımda mail gitmişti. Bu da normaldi; çünkü bu ayarları kullananlar da bu durumu yazılarında belirtmişti. Fakat daha sonra ben bir de kendi mail hesabımdan yani gmail adresini kullanarak bir Contact maili göndereyim dedim. Sonuç yine hüsran mail InBox'a ulaşmamıştı. Bu durum gerçekten çok canımı sıktı; çünkü çoğu kullanıcı artık mail hesabı olarak Gmail'i kullanıyordu. Sırasıyla Yahoo ve Hotmail hesaplarımı kullanarak mail göndermeyi denedim ve sonuç yine aynı oldu. Son olarak durumun neden kaynaklandığını belirlemek için var olan bir başka adresimden, üniversitenin verdiği mail adresini kullanarak Contact maili atmayı denedim ve bunda başarılı oldum. Bu durum başka GoDaddy kullanıcılarının başına gelmiş mi diye araştırma yaparken şu adresteki entry'ye denk geldim. Burada ne kadar doğru olduğunu bilmemekle birlikte GoDaddy Serverlarında port 465 ' in bloke olduğunu ve benim sorunumla alakalı daha başka birçok çözüm vardı. Bu yazıyı yazanın da Hotmail hesabı ile mail atarken aynı şey başına gelmişti ve sunduğu çözüm(çok da iyi olmamakla beraber) bende de işe yaradı.

Contact.aspx.cs kaynak kodu dosyasındaki şu kodu:

mail.From = new MailAddress(txtEmail.Text, txtName.Text);

Şu kod:

string email = txtEmail.Text.ToUpperInvariant();//for the String.Replace method
//Hotmail patch for GoDaddy-Hotmail-GMail issue
if (email.EndsWith("HOTMAIL.COM" ))
    email = email.Replace("HOTMAIL.COM", "_REMOVE_hotmail.com");
 
mail.From = new MailAddress(email, txtName.Text);

ile değiştirmişti. Kod yapısı çok kolay. Genel olarak bir String Search and Replace işlemi yapılıyor. Basit ama etkili bir yol. Benim yapmam gereken sadece GMAIL.COM ve YAHOO.COM adreslerini ekleyerek kodu düzenlemek oldu. Düzenlenmiş kod:

string email = txtEmail.Text.ToUpperInvariant();//for the String.Replace method
// Patch for GoDaddy-Hotmail-GMail-YAHOO issue
if (email.EndsWith("HOTMAIL.COM" ))
    email = email.Replace("HOTMAIL.COM", "_REMOVE_hotmail.com");
if (email.EndsWith("GMAIL.COM" ))
    email = email.Replace("GMAIL.COM", "_REMOVE_gmail.com");
if (email.EndsWith("YAHOO.COM" ))
    email = email.Replace("YAHOO.COM", "_REMOVE_yahoo.com");
 
mail.From = new MailAddress(email, txtName.Text);

Ben de sorun çıkaran mail domain adlarını da ekledim. Daha sonraki denemlerde bu mail adresileri ile gelen maillerin hepsini aldım. Buradaki tek sorun bu maillerden birine cevap vermek istersem; _REMOVE_ kısmını silip maili öyle göndermem gerekiyor. Neyse ki şimdi bu büyük bir sorun değil.

Dilerim, yukarıda verdiğim bilgiler benimle aynı sorunu yaşayanlara yardımcı olur.

Bu yazıyı ilk değerlendiren siz olun

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: ,

GoDaddy | BlogEngine

ASP.NET MVC ve Visual Studio MVC Web Application Template

by emrekayikcilar 07.02.2009 13:22:00

Bu yazıda ASP.NET MVC için Visual Studio 2008 kullandığımızda default olarak karşımıza gelen proje template ' inden ve bu template ' teki default olarak gelen dizinlerden bahsetmek istiyorum.

ASP.NET MVC Visual Studio 2008 kullanmadan ne kadar verimli olur, denemediğim için bilmiyorum; fakat Visual Studio 2008 kullandığımız zaman bize kolaylık sağladığı kesin. Bir kere ihtiyacımız olan ve ASP.NET MVC Framework tarafından zorunlu olarak aranan dizinlerin hepsi default olarak karşımıza gelmektedir. Bize sadece gerekli gördüğümüz programlama mantığını doğru dizinlerdeki dosyalara uygulamak kalıyor. Diğer bazı MVC Frameworklerinde olduğu gibi belli dizin ve dosya adı konvansiyonlarının izlenmesi gerekliliğini ASP.NET MVC'de de görmekteyiz. Neyse ki Visual Studio 2008 kullandığımızda en üst dizinlerin adları default olarak geldiğinden burada sorun yaşamıyoruz. Bu dizinlerin neler olduklarını ve işlevlerini kısaca anlatalım:

  • Content: Bu dizinde web uygulaması tarafından kullanılabilecek tüm CSS dosyaları ve imajlar yer alır. Internette araştırmama rağmen bu dizinin başka bir işe yaradığını vurgulayan bir yazıya denk gelemedim.
  • Controllers: Web uygulamamızın neredeyse kilit dizini. Bütün controller class dosyalarını barındırır. Örnek vermek gerekirse; default olarak gelen örnek mvc uygulamasında HomeController.cs diye bir Controller class'ı bulunur. Kullanıcı Home urlsinin alt segmentlerinde (/Home/About) gibi gezerken bu Controller devreye girer.
  •  Models: Bu dizinde web uygulamasındaki datayı sağlayan classlar bulunur. Normal ASP.NET uygulamalarından örnek vermek istersek; DataSet, LINQtoSQL, Custom olarak yapılandırılan Object Classları vb. bu dizinde bulunur. İlk başlarda kolaylık olması açısından LINQtoSQL yani .dbml dosyalarının kullanılmasını doğru buluyorum.
  • Views: Bu dizin aslında diğer View dizinlerini barındırır. İçinde her controller Class'ı için bir tane dizin bulunur. View dizin adı belirlenirken Controller Class'ının ismi (dosya ismi) de devreye girer ve View dizininin ismi ona göre belirlenir. Örnek verelim: Yukarıda HomeController.cs diye bir Class'ım olduğundan bahsettim. Eğer ben bu Controller ile ilgili Viewlar yaratmak istersem; Views\Home\ diye bir dizin açmalıyım ve ASP.NET MVC Viewlarımı burada tutmalıyım.
  • Views/Shared: Bu da standart bir dizindir. Bu dizinde diğer viewlar ile ilgili dosyalar bulunur ve  bu dosyalar bütün viewlara hizmet eder. Zaten bu dizinin içeriğine baktığımızda  Error.aspx, LoginUserControl.ascx, Site.Master dosyalarıdır. Zaten önceden de bilindiği gibi masterpage dosyaları web uygulamasında user interface bütünlüğünü korumak ve sayfaya ortak bir görünüş kazandırmak içindir yani bu dizine ilk girmesi gereken dosya budur, bence. Diğer yandan .ascx bir UserControl dosyasıdır. Bu tip kontroller birden çok sayfada bulunabilen html topluluklarını içerir. Bu kod bloklarını sürekli olarak ihtiyaç olan sayfalara kopyalamaktan ziyade UserControl şeklinde yaparak kendimize kolaylık sağlayabiliriz. Error.aspx sayfası ise; genel olarak kullanıcıların web uygulamamızda dolaşırken sayfalarda herhangi bir hata oluştuğunda görmesi için kullanılabilecek bir dosyadır ve bu dosya da web uygulamasının bütün viewları için kullanılabilir.

Standart dizinlerin işlevlerini bilmek uygulamanın sorunsuz çalışması için önemlidir. Bu sayede doğru dizine doğru class dosyasını ve MVC view dosyasını koyarak bu sorunu aşmış oluruz. Bir daha ki yazımda ASP.NET MVC'nin belkemiği olan URL Routing konusunu ve ASP.NET MVC desteği vermeyen hosting firmalarında host edilen MVC uygulamalarımızı nasıl çalıştırabileceğimizi göstereceğim.

Bu yazıyı ilk değerlendiren siz olun

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

ASP.NET MVC

ASP.NET MVC'ye Giriş

by emrekayikcilar 04.02.2009 00:07:00

Uzun zamandır, bloga entry giremediğimden kendimi çok kötü hissettim ve en sonunda entrylere tekrar başlamanın yerinde olacağını düşündüm. Bu yazıda genel olarak ASP.NET MVC'nin ne olduğundan bahsetmek istiyorum. Aslında MVC önceden de var olan bir terim; fakat ASP.NET dünyasına yeni entegre edilmiş durumda.

MVC: Model-View-Controller kelimelerinin baş harflerinden oluşur. Asıl amacı Business Logic(veritabanı ve diğer programlama mantığının)'in User Interface(Kullanıcı Arayüzü)'nden izole edilmesidir. Buradaki izolenin mantığını açıklamak gerekirse; örneğin kullanıcı arayüzü kodlarının veritabanı programlama kodlarından ayrılması ve programlama layer(tabaka)'ları oluşturularak birbirleri ile sadece iki blok arasındaki bağlantıyı kurmak üzere yazılmış olan kodlar vasıtasıyla bağlantı kurmalarını sağlamaktır.

Yukarıdaki açıklama ilk anda benim anlatımdaki berbatlığım nedeniyle karışık gelebilir; ama anlatımı aşağıdaki gibi kolaylaştırabilirim sanırım.

  • Veritabanındaki bilgiler ve bunları temsil eden kodlamalar(.NET dünyasından örnekler vermek gerekirse; LINQtoSQL .dbml dosyaları) -> Model yapısı
  • Kullanıcı arayüzü veya ASP.NET düşünüldüğünde web formlardaki kodlamalar -> View yapısı
  • Veritabanı ve kullanıcı arayüzü kodlamalarını birbirinden izole eden ve aynı zamanda bunların iletişimini sağlayan kod blokları -> Controller yapısı

olarak geçer. Burada sanırım en kafa karıştırıcı olan Controller yapısıdır. Bu yapıyı şöyle açıklayabiliriz. Diyelim ki bir intranet sitesinde belli bir mal için sipariş veren müşterileri bir web sayfasında sıralamak istiyoruz. Temelde bunu Classic ASP,PHP,ASP.NET(MVC mantığı olmayan) vs. dilleri kullanarak sayfa üzerinde bir takım template haline gelmiş kodlar ve SQL sorguları sayesinde kolayca sıralayabiliriz. (Bu arada belirtmek isterim ki PHP temelli yazılmış olan bir çok MVC framework vardır. Örneğin Zend Framework PHP uygulamalarının MVC mantığı ile yazılmasını sağlar.) Fakat verilen bu işi MVC kullanarak yazmaya kalkarsak; yazılan kodların MVC'deki hangi bölüme gitmesi gerektiğini iyi bilmeliyiz. Şöyle ki:

  •  
    • Öncelikle sayfadaki yer alacak olan işlemleri düşünmeliyiz. Örneğin müşterilerin listelenmesi, yeni sipariş eklenmesi gibi. Bu işlemleri daha sonra hangi sayfalarda göstereceksek ona göre gruplama yapmalıyız. Bu durumda ilk olarak Controller methodlarını oluştururuz. Çünkü bu methodların isimler aynı zamanda sayfaların URL ' sini de belirler. Örneğin sipariş ekleme sayfası hazırlamak istediğimizde ekleme Controller metodunun ismini CreateNew diye tanımlarsak; sipariş ekleme formunda formun gideceği URL'yi(formun action attribute'unun değeri) /Home/CreateNew olarak belirleriz ki bu da zaten HomeController Class'ı altındaki CreateNew metoduna denk gelen bir adlandırmadır. Yani MVC'de Controller methodların sunucuya isteğin hangi View'da geldiği bu şekilde belirtilir.
    • Model tarafında düşündüğümüzde ise; modeli veritabanımızdaki bilgiler oluşturur. Yukarıdaki örneğimizde iki ilişkili tabloyu düşünebiliriz. Bu örneğe göre iki tabloya ihtiyacımız vardır. Customer ve Order tabloları birbirleri ile ilişkilendirilerek veritabanı oluşturulabilir. Customer tablosunda Primary Key olarak bulunan CustomerID aynı zamanda Order tablosunda da Foreign Key olarak yer alır ve ikisi arasında ilişkilendirme yapılır. Burada bir müşterinin birden fazla siparişi olabileceği düşünülerek böyle bir ilişkilendirme yapılmıştır. Aynı zamanda Model LINQ kullanacağız bu yüzden her bir tabloda primary key bulunmalıdır; çünkü LINQ primary key'den yararlanarak UPDATE işlemlerini yapmaktadır. Belirttiğimiz gibi Model kısmında .dbml yani LINQtoSQL dosyası oluşturulur. Bu dosya Visual Studio'da karşımıza Object Relational Designer olarak çıkar ve Server Explorer'dan dosya üzerine tablolarımız sürükleyip bıraktığımızda her tabloyu map eden Classlar oluşturulur. Bu şekilde Model tarafında işimizi kolayca görmüş oluruz. Bu arada bu yöntem Model oluşturmanın kolay bir yöntemidir ve pek tavsiye edilmez. Burada işlerimiz biraz kolay olsun diye bu şekilde yaptık.
    • View'da ise; kullanıcı arayüzü oluşturulur. Yani veritabanındaki bilgilerin kullanıcıya gösterildiği bölüm View'dur. Burada hepimizn bildiği html kodları ve ASP.NET template tagları bulunur. Bu tagları Classic ASP'de herhangi bir tablodaki kayıtları listelerken kullandığımız şekilde <% %> server tagları arasında yazarız ve kullandığımız dile göre(C#, VB.NET ve diğer .NET dilleri) yazımları değişir; ama genel mantık aynıdır. Hemen bir örneğini vermek gerekirse;
<ul>
 <% foreach(MVCTaskList.Models.Task task in (IEnumerable)ViewData.Model)
    {%>
       <li>
           <% if ((bool)task.IsCompleted)
              {%>
                <del><%= ((DateTime)task.EntryDate).ToShortTimeString()  %>---<%= task.TaskName  %></del>
           <% }
              else
              { %>
                <a href="/Home/Complete/<%= task.TaskID %>">Complete</a>---
                <%= ((DateTime)task.EntryDate).ToShortTimeString() %>---
                <%= task.TaskName %>
            <%} %>
      </li>
<% } %>
</ul>

    Yukarıdaki örnekte veritabanından gelen bilgiye göre yapılacak olan bir listelemeyi görüyorsunuz. Bu örnek asp.net sitesindeki Creating ASP.NET MVC Tasklist örneğinin C# versiyonundan alıntıdır. Classic ASP'yi bilen arkadaşlara çok tanıdık geleceği kanısındayım.

  • ASP.NET MVC ' ye bu şekilde teorik bir giriş yapmış olduk. Bir dahaki yazıda bir örnek ile bu kavramları açıklayarak MVC ' yi daha iyi ifade etmiş olacağız.

1 kişi tarafından 5.0 olarak değerlendirildi

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

ASP.NET MVC

Sql Server 2005 "Restore Database" Hatası

by emrekayikcilar 06.10.2008 18:52:00

Herhangi bir nedenden dolayı mevcut veritabanlarınızı kendi bilgisayarınızdan başka bilgisayara götürmek istediğimiz zaman genelde backup işlemine başvururuz. İster direkt olarak Sql Server Management Studio arayüzünü kullanalım istersek de direk olarak sql scripti ile backup işlemini yapalım, backupları diğer bilgisayarda restore etmeye kalktığımız zaman bir kaç sorunla karşılaşabiliriz. Bunlardan en önemlisi backup aldığımız bilgisayarda, backupını aldığımız .mdf dosyasının hard diskteki fiziksel yeri ile restore işleminin gerçekleşeceği default dizinin(Default dizin genelde Data dizinidir) uyuşmamasından kaynaklanır. Örnek olarak:

Backup yapılan bilgisayardaki dizin => D:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\veritabani.mdf

Restore edilen bilgisayardaki dizin => C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\veritabani.mdf

"Restore Database" diyalog kutusunda bu durumu gözden kaçırıp doğru yeri belirtmezsek aşağıdaki hatayı alırız.

Restore failed for Server 'Bilgisayar_adı'. (Microsoft.SqlServer.Smo)

System.Data.SqlClient.SqlError: Directory lookup for the file "D:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\veritabanı.mdf" failed with the operating system error 21(error not found). (Microsoft.SqlServer.Smo)

Bu hatayı çözmek için biraz dikkatli olmak yeterlidir. Aşağıda görülen diyalog kutusunda veritabanı ve log dosyasının "Restore As" kısımlarını doğru olarak girmek yeterlidir.

sql_hata_1

 

Daha sonra normal Restore işlemini devam ettirirsek, işlemin başarılı olduğunu görürüz.

1 kişi tarafından 5.0 olarak değerlendirildi

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

SQL Server 2005

İnternetteki Çoğu Siteye(Genellikle Microsoft Network İçinde Bulunan) Erişimin Olmaması ve Bu Sorunun Çözümü

by emrekayikcilar 15.09.2008 00:04:00

Bu sorunun birçok nedeni olabilir. Bunların başında işletim sisteminin yanlış yapılandırılmış olan ağ bağlantısı ayarları veya bir virus, trojen ya da spy sorunu olabilir. Bu sorunlar genellikle bağlantı ayarlarının incelenmesi ya da iyi performansa sahip antivirus programlarından birini kurarak çözülebilir. Örneğin Internet Explorer 7 ' ye dadanan birçok spy programın Internet Explorer ' ın dengesiz bir şekilde tablarının açılıp kapanmasına neden olduğunu ve internet erişimini kısıtladığına tanık oldum.

Burada bahsetmek istediğim konu bu tarz bir durum değildir. Çünkü kullanıcı erişim sağlayamadığı sitelere diğer tarayıcılar ile de girememektedir. Hatta bu sitelere "ping" komutunu kullanarak bile paket gönderip alamamaktadır. Son bahsettiğim durum aslında sorunu çözmede bize yardımcı olabilecek bir bilgidir. Çünkü bir siteye ping komutu ile ulaşamamak demek ICMP(Internet Control Message Protocol) protokolünün görevini yapamaması anlamına gelmektedir. Bu hatalar zincirinde en son halka ise; MTU(Maximum Transmission Unit) ' dur. Bu birim, kullanıcı bir siteye bağlanmak istediğinde olacak veri paketi alışverişinde hangi boyutlarda paketlerin gönderilip alınacağını belirler. Eğer site bu değeri belirleyemez ise; Windows makinelerede varsayılan değer olarak kullanılan 1500 ' ü kullanır. Fakat kullanılan birçok router, modem vs. bu değerden daha az MTU ayarına sahip olduğundan bu paketleri alamaz ve internet sayfalarının açılması yarıda kalır veya hiç açılmaz. Biz de aldığımız bütün önlemlere(Virus temizleme, Temporary Internet Files dizinindeki dosyaların temizlenmesi) karşın sitelere erişemeyiz. Bunu çözümlemek için yapılabilecek birkaç şey vardır:

  1. Modemimizin ayarlarıyla oynama. Öncelikle modemi resetlemek ile işe başlayabiliriz. Bu şekilde o anda internet bağlantımızda gerçekten bir sorun olup olmadığını bilebiliriz. 
  2. Genelde modemde ADSL kısmında ADSL AYARLARI diye bir bölüm vardır. Bu bölümde de Enforce MTU diye ya da ona benzer bir ayar seçeneği olması lazım. (En azından benim kullandığım Airties RT-102 ' var.) Bu ayarı 1500 ' den küçük bir değer yapmalıyız. Bu değeri belirlerken internette araştırma yapmama rağmen değeri neden söz konusu olan değer yaptığını belirten bir kullanıcı göremedim. Her neyse değer olarak Airties modemlerde 1492 vurgulanmış. Ben de şu an bu değer ile internete girmekteyim. Bu değeri girdikten sonra kaydedip modemin arayüzünden çıkarız. (Bazı modemlerde ayarlar yapıldıktan sonra modemin tekrar başlatılması gerekiyor. Modem sizin yerinize bu işi yapıyor.)
  3. Google aramalarımdan çıkardığım başka bir sonuç ise; yukarıdaki iki durumdan sonuç alınamaz ise; Windows tarafında da bu ayarın yapılması lazım. Bu ayarları yapmak için DrTCP adında bir program kullanılıyor. Bu program küçük olmasına rağmen hayli ayar içermektedir. Ben kendi ayarlarımı yapmak için şuradan yararlandım. Bu sitede bu şekilde network ayarlamaları açısından yararlı bir yerdir. Biraz göz atmanızı tavsiye ederim.

Yukarıda belirttiğim işlemlerden sonra bağlantımdaki sorun giderdim. Umarım sizin sorununuz da hallolur. Fakat unutumayın ki internete bağlanamayışınızın nedeni bir spy program da olabilir. Bu durumda öncelikle bilgisayarınızı bir spyware program ile taratmanızı öneririm.

2 kişi tarafından 3.0 olarak değerlendirildi

  • Currently 3/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

Networking

Exception Handling Konusuna Giriş

by emrekayikcilar 06.08.2008 11:38:00

Programları kodlarken kodlamada yaptığımız hataları derleyici yardımıyla bulabiliriz. Derleyici işimizi çok kolaylaştırır. Bu durum Visual Studio'da da böyledir. Errors ve Warnings pencerelerinde yaptığımız hatalar derleme anında bize haber verilir ve programımızı hatasız bir şekilde kodlamamıza yardımcı olurlar. Fakat bazı durumlarda syntax olarak hata yapmamamıza rağmen herhangi başka bir durum yüzünden program runtime(çalışma durumunda)'da iken program hata verir ve sinir bozucu bir hata ile karşılaşırız. Bu hatalar genellikle programcının beklemediği ya da bazı varsayımlarda bulundukları zaman ortaya çıkar. Örneğin programda dosya sisteminden bir programın açılması gerekiyorsa; bu programın öncelikle sistemde bulunması gereklidir. Programcı algoritmasını kurarken bunu dikkate alıp ona göre davranırsa sorun çıkmaz. Fakat bu dosyanın sistemde olup olmadığının kontrolünü yapmadığı durumlarda aşağıdaki hata mesajı ile karşılaşılır.

filenotfoundexception

Böyle bir durumda Exception Handling yapılsaydı bu durum ile karşılaşılmazdı. Exception handling try-catch-finally kod blokları kullanılarak yapılır. Anlatımı kod ile yapmak daha yararlı olacağından kısa bir program kodu kullanılarak mevcut durum özetlenebilr. Yapacağımız programda sistemdeki bir dosyayı exception handling yaparak  açmaya çalışacağız. Programı kolay olması açısından Console Application olarak seçtim. Siz de File>New>Projects yaparak bir Console Application açarak burada yapılanları deneyebilirsiniz. Programda kısa bir kod I/O(Input/Output) işlemi yapacağımızdan dolayı namespaceleri çağırdığımız yerde System.IO namespace'ini çağırmak gereklidir.

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Text;
   4: using System.IO;

Bundan sonra normal kodlamaya geçelim.

 

   1: namespace ExceptionHandling
   2: {
   3:     class Program
   4:     {
   5:         static void Main(string[] args)
   6:         {
   7:             try
   8:             {
   9:                 // c:\test2.txt dosyası aslında sistemde yok
  10:                 FileStream fs = new FileStream("c:\\test2.txt", FileMode.Open);
  11:             }

Programın ilk açıldığı haldeki durumuna sadece try kısmını ekledik. Burada önemli olan sistemde açılmak istenen dosyanın bulunmamasına karşın bizim açmak istememizdir. FileMode.Open modunda dosya sistemde yoksa yaratılmaya çalışılmaz. Dosya modları hakkında bilgiyi Help->Index bölümünden FileMode Enumeration yazarak bulabiliriz. Yukarıdaki kod eğer try bloğunun dışında olsaydı, yukarıda belirtilen hata ile karşılaşılacaktı. Şimdi sıra, hatayı almamız durumunda programın çalışmasına ne şekilde devam edeceğini belirlemeye geldi.

 

   1: catch (FileNotFoundException e)
   2: {
   3:     Console.WriteLine("Sistemde boyle bir dosya bulunmamaktadir");
   4:     //  FileStream fs = new FileStream("c:\\test.txt", FileMode.CreateNew);
   5: }

 

Programın kısa tutulması açısından pek de işe yarar bir kodlama olmadı; fakat açıklama satırı halindeki kod kullanılarak gerçek uygulamar yazılabilir. Burada konsola sadece hata mesajı yazdırırız. Burada önemli bir konu da kodlamayı yaparken biraz spesifik davranmamızdır. .NET'te bir çok önemli exception vardır ve hepsi de System.Exception classından türerler. Burada FileNotFoundException durumu ortaya çıkarsa ne yapılacağı belirtilir.Bu exception sistemde işlem yapılacak dosyanın bulunmadığı durumlarda ortaya çıkar. System.Exception classı hakkında daha fazla bilgi için yine Help kısmından yararlanılabilir. Kodlamanın son kısmında ise; hatanın yakalanması garanti altına alınır.

   1: catch (Exception e)
   2: {
   3:     // olabilecek bütün exceptionları yakala
   4:     // hata mesajını konsola bas
   5:     Console.WriteLine("The message was: " + e.Message);
   6: }
   7: finally
   8: {
   9:     Console.WriteLine("Her durumda yapılması istenen işlemler burada belirtilir.");
  10: }
  11: Console.ReadKey();
  12: } // Main kapandı
  13: } // Class kapandı
  14: } // Namespace kapandı

Son kısımda catch bloğunda kullanılan parametre ile yukarıda yakalanan exception ile kod içinde işlemler yapılabilir. Mesela burada ilgili exception'a ait sistem hata mesajını konsol ekranına bastırırız. Son olarak buraya kadar bahsetmediğim finally bloğunda ise; her durumda yapılması gereken işlemler belirtilmelidir. Bu kodlamada önemi fazla vurgulanmasa da kullanımda çok önemli yeri vardır. Örneğin veritabanı ile bağlantı kurulan uygulamarda açılan veritabanı bağlantısını işimiz bitince kapatmak iyi bir alışkanlıktır. Fakat bunu unuttuğumuz durumlar olabilir. Eğer kapatma kodunu finally bloğu içerisinde yazarsak işimiz bitince program nasıl olsa finally bloğuna düşecek ve bağlantımız kapanmış olacaktır. En son kod olarak açılan konsol ekranının kapanmaması için Console.ReadKey() yazarak programı sonlandırırız. Programın çalışmasından elde edilen çıktı aşağıda görülmektedir.

exception_konsol

İlk catch bloğu exception yakaladığından dolayı sistemin vereceği mesaj görüntülenmedi.

Exception Handling ile ilgili daha fazla bilgiye buradan ulaşabilirsiniz.

3 kişi tarafından 3.7 olarak değerlendirildi

  • Currently 3,666667/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

.NET Temel Bilgiler

Powered by BlogEngine.NET 1.3.1.0
Theme by Mads Kristensen

Yazar Hakkında

Yazarýn Adý Emre Kayıkçılar
Felaket boş bi adam.

Bana mesaj at Send mail

Takvim

<<  Temmuz 2009  >>
PaSaÇaPeCuCuPa
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

Yazılara bir de takvimde bakayım

Sayfalar

    Son yorumlar

    Feragatname

    Bu filmdeki olaylar ve kahramanlar hepsi fikşişizdır.

    © Copyright 2009 Emre Kayıkçılar

    Giriş