C# etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
C# etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

Perşembe, Ekim 13, 2016

Getting Values from SharePoint 2013 Property Bags

SharePoint 2013 has a hierarchical set of property bags. At each of the following levels in a SharePoint farm, one can store properties and their corresponding values:

  • Farm
  • Web Application
  • Site
  • Web
  • List

This can be extremely handy when writing code. For example, if you have four different environments (Development, QA, Staging, Production), you could store properties in each environment's farm property bag that specifies things like connection strings, debugging constants, or host URLs.

It's even handier when you have a simple means to extract these properties from the property bag in your code. I generally make a class (FarmProperty in the example below) with a "Get" method that extracts the string value for the given property.

    public class FarmProperty
    {
        public static string Get(string name)
        {
            string value = null;
            SPSecurity.RunWithElevatedPrivileges(() =>
            {
                var farm = SPFarm.Local;
                foreach (var prop in farm.Properties.Cast().
Where(prop =>; prop.Key.Equals(name)))
                {
                    value = prop.Value.ToString();
                }
            });
            return value;
        }
    }


To use this code, just call the Get method on the FarmProperty class. If the property doesn't exist, it will return null.

    var reportServerHost = FarmProperty.Get("ReportServerHost");

Salı, Şubat 02, 2010

WF - Parametre Kullanımı

Windows Workflow (WF) teknolojisini şu ana kadar temel uygulama tipleri ve istisnai durumlar (Exceptions) konularını inceledik. WF ile uygulama geliştirirken hangi adımlara dikkat etmemiz gerektiği ve kafamıza takılan geliştirme işlemlerini nasıl yapabileceğimizi detaylı bir şekilde inceleyerek yazılarımıza devam ediyor olacağız. Bu sefer ise WF 'da parametre kullanılmasını inceliyor olacağız.

Son kullanıcının kullanımına açılacak uygulamalar çok büyük oranda istek cevap mantığına göre çalışmaktadır. Bu istekleri taşıyabilmek için ise uygulamalarda parametrelerden yararlanılmaktadır. Bu parametreler hem uygulama içerisinden herhangi bir değerden gelirken dış veri giriş ya da istek controlleri yardımı ile de kullanılabilmektedir. Özellikle portal sistemlerinde iş akışı kullanımı çok yoğundur ve gönderilen parametreler doğrultusunda izin talepleri, araç istekleri, döküman paylaşımları ve akla gelmeyen diğer iş akışlarının hazırlanmasında parametre kullanımı çok ama çok fazladır. Bu sebepten ötüdür ki bu konu WF teknolojisi ile uygulama geliştiren geliştiriciler de çok önceliklidir.

Şimdi biz bu işlemleri WF teknolojisi üzerinde nasıl kullanabilceeğimizi incelemeye başlayalım. Visual Studio 2010 (VS2008 ya da WF eklentileri yüklenmiş VS2005 'te olabilir. Aynı özellikler her ikisinde de geçerlidir.) üzerinde Workflow seçeneği seçili iken .Net Framework 3.0 sürümü altında yer alan Sequential Workflow Console Application proje şablonunu seçiyor ve ismini ParameterParsing vererek  projeyi oluşturuyoruz. Sonrasında karşımıza alışık olduğumuz WF tasarım ekranı ve bileşenlerimiz gelecektir.

Tasarım ekranı üzerine Code Activity bileşenini sürüklüyor ve ExecuteCode olayınına parametre alabilmesi için gerekli işlemleri uygulamaya başlıyoruz.


Sonrasında kod tarafına basit bir string özellik oluşturup codeActivity bileşeninin içerisinde kullanılmak üzere ekliyoruz.

private void codeActivity1_ExecuteCode(object sender, EventArgs e)
{
    Console.WriteLine("Bulunan string değer: [{0}]",StringToPrint);
}

private string _stringToPrint;

public string StringToPrint
{
    get { return _stringToPrint; }
    set { _stringToPrint = value; }
}

Eklemiş olunan CodeActivity bileşeni üzerinde parametre kullanılması için gerekli hazırlıklar tamamlandı. Peki, parametreler nereden gelecek? Bu örneğimiz için Program.cs içerisinde yer alan WorkflowRuntime.CreateWorkflow metodunun içerisine Dictionary<> olarak bir parametre daha vereceğiz. Bu parametre bizim hazırlamış olduğumuz Workflow tasarım ekranını hazırlarken belirlemiş olduğumuz özelliklerin isimlerini ve alacakları değerleri vermemiz durumunda onlar global olarak değişkenleri kabul edecek ve gerekli değerleri tanımlayacaktır.

Yukarıda belirttiğimiz şekilde Program.cs dosyasının içerisini düzenledikten sonraki son görünüm aşağıdaki gibi olacaktır.

using System;
using System.Collections.Generic;

using System.Threading;
using System.Workflow.Runtime;

namespace ParameterParsing
{
    class Program
    {
        static void Main(string[] args)
        {
            using (WorkflowRuntime workflowRuntime = new WorkflowRuntime())
            {
                AutoResetEvent waitHandle = new AutoResetEvent(false);
                workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) { waitHandle.Set(); };
                workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e)
               {
                   Console.WriteLine(e.Exception.Message);
                   waitHandle.Set();
               };
               Dictionary<string, object> parameters = new Dictionary<string, object>();
                    parameters.Add("StringToPrint", "Parametreleri kullanarak sonuçları elde ettik...");
               WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(ParameterParsing.Workflow1),parameters);
               instance.Start();

               waitHandle.WaitOne();
            }
        }
    }
}

Workflow1.cs dosyasına eklemiş olduğumuz StringToPrint özelliğini program.cs dosyasında bir koleksiyonun içerisinde tanımladıktan sonra iş akışı başladığında çağırılacak parametrelerin arasında olması için intance 'ın parametreleri arasına ekledikten sonra işlemimizi tamamlamış oluyoruz.

Yapmış olduğumuz işlemler sonrasında uygulamamızı çalıştırdığımızda karşımıza aşağıdaki gibi bir ekran çıktısı çıkacaktır.



Daha önce de bahsettiğimiz gibi WorkflowInstance 'a atayacağımız değeleri CreateWorkflow metodunun sonucunda dönecek olanlardan elde ediyorduk. Bu metotta birden fazla aşırı yüklemeden oluşmaktadır. Bunlardan biri de kolleksiyonla birlikte işlem yapandır. Biz de bu metottan yararlanarak oluşturmuş olduğumuz Dictionary koleksiyonunu ekleyerek işlemimizi yaptık.

Şimdi örneğimizi biraz daha karmaşıklaştırarak parametre kullanımını incelemeye devam edelim. Bu sefer bir kullanıcı sınıfı oluşturalım. Sonrasında bu sınıfın içerisine Adı ve Soyadı diye iki adet eleman tanımlayalım. Sonrasında ise oluşturmuş olduğumuz bu sınıfın içerisinde yer alan elemanları Workflow tasarım ekranı üzerinde eklemiş olduğumuz CodeActivity bileşeninin çalışma esnasında görüntülenecek şekilde hazırlayalım.

Eklemiş olduğumuz işlem sonrasında Workflow1.cs 'nin içeriği aşağıdaki gibi olacaktır.

using System;
using System.Workflow.Activities;
using System.Collections.Generic;

namespace ParameterParsing
{
    public class Kullanici
    {
        public Kullanici(string ad, string soyAd)
        {
            this.adi = ad;
            this.soyAdi = soyAd;
        }

        private string adi;

        public string Adi
        {
            get { return adi; }
            set { adi = value; }
        }
        private string soyAdi;

        public string SoyAdi
        {
            get { return soyAdi; }
            set { soyAdi = value; }
        }
    }

    public sealed partial class Workflow1 : SequentialWorkflowActivity
    {
        public Workflow1()
        {
            InitializeComponent();
        }

        private void codeActivity1_ExecuteCode(object sender, EventArgs e)
        {
            foreach (Kullanici k in Insan)
            {
                Console.WriteLine("İsminiz [{0},{1}] 'dir.", k.Adi, k.SoyAdi);
            }
        }

        private List<Kullanici> insan;

        public List<Kullanici> Insan
        {
            get { return insan; }
            set { insan = value; }
        }
    }
}

Kod parçasını yukarıdaki şekilde oluşturduk ve iş akışının çalışması esnasında oluşacak işlemleri de hazırladık. Şimdi program.cs üzerinden gerekli parametreleri oluşturabiliriz.

using System;
using System.Collections.Generic;

using System.Threading;
using System.Workflow.Runtime;

namespace ParameterParsing
{
    class Program
    {
        static void Main(string[] args)
        {
            using (WorkflowRuntime workflowRuntime = new WorkflowRuntime())
            {
                AutoResetEvent waitHandle = new AutoResetEvent(false);
                workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) { waitHandle.Set(); };
                workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e)
               {
                   Console.WriteLine(e.Exception.Message);
                   waitHandle.Set();
               };
               Dictionary<string, object> parameters = new Dictionary<string, object>();
                    List<Kullanici> insan = new List<Kullanici>();
                    insan.Add(new Kullanici("Tur", "Tem"));
                    insan.Add(new Kullanici("Ser", "Tur"));

                    parameters.Add("Insan", insan);
               WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(ParameterParsing.Workflow1),parameters);
               instance.Start();

               waitHandle.WaitOne();
            }
        }
    }
}


Oluşturulan sınıfa ait varlıklara değerleri atadık ve sonrasında uygulamayı çalıştırdığımızda bu değerleri sorunsuzca göreceğiz.



Bir önceki örneğimizde string bir değeri tutan bir parametreyi akış bileşenin nasıl kullanacağımızı gördük. Bu örneğimizde de Oluşturduğumuz bir sınıfı (Veri tabanı tablosu gibi de düşünebilirsiniz) içerisinde yer alan varlıklardan yararlanarak buna değerler atadık ve yine codeactivity bileşenin içerisinde sorunsuzca gösterebildik.

Sonuç olarak Workflow Foundation ile geliştirilen uygulamlarda parametreleri el ile atayıp kullanabileceğimiz gibi bir veri topluluğu içerisinde de çekip kullanabiliriz. Ayrıca bu parametreleri kullanabilmemiz için program.cs sınıfının içerisinde CreateWorkflow metoduna parametre olarak  generic tipten bir parametre ekleyerek parametrelerin kullanılmasına olanak tanıyabiliriz.

Bir sonraki yazımızda Workflow Foundation ' da Paralel Aktiviteleri inceliyor olacağız.

Umarım yararlı olabilmiştir.

Turhal Temizer

info@turhaltemizer.com
turhal.temizer@csharpnedir.com

Cuma, Ocak 22, 2010

WF - Exception İşlemleri

Günümüzde iş akışı teknolojilerini sayar mısınız şeklinde bir soru geldiğinde bu çözümün Microsoft kanadında ki ürünü olarak aklımıza ilk olarak Windows Workflow Foundation çözümü gelmektedir. Özellikle insanlar tarafından tetiklenen (Human Workflow) iş akışı yapıları arasında çok kullanışlı bir teknoloji olarak bulunmaktadır.

Workflow Foundation teknolojisi incelemeye hem kod yardımı ile hem de tasarım ekranı üzerinden yapmış olduğumuz basit bir uygulama ile başlamıştık. Bu yazı dizimizde ki ana amaç iş akışı ile ilgili uygulama geliştirmek istediğimizde nasıl aklımızda nasıl yapacağız şeklinde bir soru işareti kalmadan rahatlıkla yapmaktadır.

Geliştirilen bütün uygulama tiplerinde ortaya çıkan istinai durumları (Exception) tespit edip kontrol ediyor olabilmek en önemli özelliklerden birisidir. Bu yazımızda Workflow uygulamalarında istisnaları nasıl kontrol edebileceğimizi incelemeye çalışıyor olacağız.

WF 'te Exception kavramını örnek üzerinden incelersek çok daha akılda kalıcı olacaktır. Örneği, Visual Studio 2010 Beta 2 IDE 'sinde .Net Framework 3.0 sürümü üzerinde geliştiriyor olacağız. Peki, neden .Net 4.0 dururken 3.0 üzerinde geliştiriyoruz. Sharepoint uygulamaları (2010 sürümü dahil olmak üzere), daha önceden geliştirilen uygulamaları  ve .Net 3.0 ile geliştirilecek olan yeni uygulamaları göz önünde tutarak bu teknoloji üzerinde inceliyoruz.

Uygulamamız için proje şablonlarından Workflow seçeneğini ve Framework sürümü olarakta .Net 3.0 'ı seçtikten sonra Sequential Workflow Console Application 'ı seçerek çalışmaya başlayabiliriz.



Exception örneğini basitçe inceleyebilmek için karşımıza çıkan dizayn ekranına Code Activity bileşeni ekliyoruz.



Sonrasında eklemiş olduğumuz kontrolün üzerine sağ tıklama yaptıktan sonra properties ekranından events (olaylar) seçeneğinden ExecuteCode seçeneğine çift tıklayarak arka plana kod oluşturuyor ve aşağıdaki basit kod parçasını ekliyoruz.



private void codeActivity1_ExecuteCode(object sender, EventArgs e)
{
    throw new ApplicationException("Başarısız oldu...");
}

Code Activity kontrolünün çalıştığı anda çalışacak olan olayına uygulamanın istisnai duruma düşmesi için gerekli kod parçasını ekliyoruz. Bir önceki yazımızdan da hatırlayacağınız üzere WorkflowRuntime sınıfının altında yer alan WorkflowTerminated özelliğinden düşen istisnai durumları görüntüleyebilmemiz mümkündür. Eğer ki uygulamayı çalıştırır ve olayı bulunduğu delegate 'in içerisinde yer alan kod parçasının içerine breakpoint eklememiz durumunda debug anında düştüğünü ve bizim eklemiş olduğumuz mesajın yazıldığını göreceğiz.



Basit anlamda ilk istisna yakalanması işlemini sağladık. Hata durumlarını daha spesifik yakayabilmemiz için workflow ortamında iki adet daha exception tipi bulunmaktadur. Bunlar Cancel Handler ve Fault Handler 'dır.


Bizim şimdi değineceğimiz bölüm ise View Fault Handlers olacaktır. İşlemin sonuçlanamadığı durumlar için bu bölüm kullanılmakta ve istisnaları yakalamak için Fault Handler bileşeni kullanılmaktadır.



Bu bileşeni Fault Handlers bölümüne sürükledikten sonra karşımıza çıkan ekranın üzerine sağ tıklama yaptıktan sonra properties ekranına geliyor ve FaultType 'a biraz önce CodeActivity içerisinde kullanmış olduğumuz ApplicationException sınfını bularak seçiyoruz.

Not: Bu tip mscorlib 'in içerisinde yer alan System isim alanında yer alır.



Sonrasında view fault handlers ekranında eklemiş olduğumuz FaultHandler bileşeninin içerisine Code Activity sürükledikten sonra properties ekranından ExecuteCode olayına istediğimiz hata mesajını yazdırıyoruz.

 
Eklemiş olduğumuz kod parçası aşağıdaki gibi olacaktır.

private void codeActivity2_ExecuteCode(object sender, EventArgs e)
{
    Console.WriteLine("Olamaz... Yakaladın beni.");
    Console.ReadLine();
}

Daha sonra uygulamayı derleyip debug modda çalıştırdığımızda iş akışı içerisine eklemiş olduğumuz code activity 'de ilk olarak hataya düşecek ve sonrasında da faulthandler içerisine düşücektir.



Düşündüğümüz senaryolar sorunsuzca çalışıyor. Şimdi ise iş akışı tasarım ekranına Sequence ekliyoruz ve daha önce oluşturmuş olduğumuz codeActivity1 isimli kontrolü bu bileşenin içerisine ekliyoruz.


Sonrasında daha önce fault handlers durumunda yapmış olduğumuz işlemlerin hepsini tekrarlayarak aşağıdaki durumu sağlıyoruz.


Sonradan eklemiş olduğumuz sequence 'in içerisine eklemiş olduğumuz FaultHandler bileşeninin içerisine düşen istisnai durumları artık gözlemleyebiliriz. Projemizi derledikten ve hatasız olduğunu anladıktan sonra debug mod ile çalıştırdıktan sonra sequence içerisine eklemiş olduğumuz hata bilgisine geldiğini ve bu mesajı gösterdiğini gözlemleyeceğiz.


Ayrıca uygulama çalıştırılırken gözlemleneceği gibi ilk olarak en iç tarafta yer alan yerel iş akışları tamamlanmakta ve sonrasında dış akışlara geçilmektedir. Bu mantıktan ötürüde en son eklediğimiz sequnce bileşeninin içerisinde bulunan FaultHandler 'a girecek ve akışı burada kesecektir. Bu sayede iç kontroller esnasında eğer ki akışta bir problem çıkarsa akışı durdurup hata mesajını en son adımı beklemeden verdirebilme olanağımız olacaktır.

Hazırlanmış olan proje çalışırken herhangi bir aksaklık (Fault) ortaya çıkması durumunda istediğimiz mesajları gösterebileceğimizi gördük. Ancak daha önceden de değindiğimiz gibi uygulama esnasında ortaya çıkan sorunlar ApplicationException sınıfında tutulmaktadır. Bu sebepten ötürü iş akış diyagramına eklemiş olduğumuz FaultHandler bileşeninin özellikler kısmında yer alan Fault kısmını kullanarak belirtmiş olduğumuz hata mesajını verdiyor olacağız. Hatırlayacağınız üzere yazımıza ilk başladığımızda ApplicationException sınıfını kullanmış,  WorkflowRuntime sınıfının workflowTerminated olayını tetiklemiş ve oluşan uygulama aksaklıklarında "Başarısız oldu..." mesajını verdirmiştik. Bu durumu şimdi FaultHandler bileşenini eklemiş olduğumuz yerlerde nasıl kullanacağımıza göz atalım.

FaultHandler bileşenin üzerinde sağ tıklama yaptıktan sonra karşımıza çıkan ekrandaki özelliklerden Fault özelliğine değeri atayacağız.

Bu değer için ApplicationException sınıfında bir özellik (property) tanımlayıp kullanıyor olacağız.

private ApplicationException myException;

public ApplicationException MyException
{
    get { return myException; }
    set { myException = value; }
}

Özelliği tanımladıktan sonra biraz önce göstermiş olduğumuz yere yol olarak MyException özelliğini veriyoruz.



Artık uygulamamızı çalıştırıp hata mesajımızı olabilirim. Debug modda çalıştırdığımız karşımıza çıkan durum tam istediğimiz gibi olacaktır. Daha önceden MyException sınıfını kullanarak belirttiğimiz hata mesajını belirttiğimiz her yerde görebilme olanağımız vardır.


Gözlemlediğimiz üzere istediğimiz mesaj değer olarak karşımıza çıkmıştır.

Şimdi yapacağımız işlemde ise Sequence içerisinde yer alan codeActivity 1 'i silmek ve yerine Throw bilşenini eklemek olacaktır. Bu sayede proje çalışırken karşılaşılan herhangi bir istisnai durumda fırlatılan hatayı kontrol etmiş ve istediğimiz mesajı verebilmiş olacağız.

Throw bileşeninde kullanılmak üzere ApplicationException sınfından yararlanılarak bir özellik oluşturuyoruz.

public ApplicationException ExceptionToThrow
{
    get { return (new ApplicationException("Pardon!")); }
}


Throw bilşeninde özelliği aşağıdaki gibi kullanabiliriz.


ThrowActivity bileşenine sağ tıklama yaptıktan sonra Fault özelliğine daha önceden tanımlamış olduğumuz özelliği atıyoruz.



Bu işlem sonrasında artık projemizi oluşturup hazırlanan property 'ler yardımı throw bilşenini kontrol edebiliriz. Debug ile breakpoint noktasına geldikten sonra MyException.Message 'dan dönecek olan değere ExceptionToThrow a atamış olduğumuz değeri görürüz.


Görüldüğü üzere istediğimiz hata mesajını göstermiş oluyoruz.

Bu örnek ile geldik bir yazımızın daha sonuna, bu yazımızda Windows Workflow Foundation 3.0 ile Exception kavramını detaylı bir şekilde incelemeye çalıştık. Hem kod yardımı ile hemde gerekli WF bileşenlerinin kullanarak nasıl kullanabileceğimize değinmiş olduk.

Umarım yararlı olabilmiştir.

Turhal Temizer

info@turhaltemizer.com
turhal.temizer@csharpnedir.com

Salı, Kasım 03, 2009

Sharepoint - Dinamik Olarak MasterPage Değiştirmek

Microsoft Sharepoint Server ve MOSS teknolojisi günümüzde portal sistemleri denince akla ilk gelen ve şirket yöneticilerinin aklına gelen ilk teknolojidir. Esnek yapısı ve alt yapı mimarisi ile geliştiricilerin işlerini kolaylaştıran araçları ile insanların ilgilisini çok kısa zamanda çekti ve çekmeyede devam edecektir. 

Bu yazımızda Sharepoint teknolojileri kullananan kurumlardan en çok istenen isteklerden birinin nasıl çözüleceğini incelemeye çalışacağız. Örneklemek gerekirse, bir kurumun içinde üç farklı çalışma grubu var yöneticinizin bu çalışma gruplarından hangisi sisteme girdiyse ona özel bir tasarım görünmesini istiyorum şeklinde isteği olabilir. Bu durumda bizim yapmamız gereken gerekli çözümleri üretip işi sonuca ulaştırmaktır.

Sharepoint Server ile MOSS üzerinde geliştirme yapılmaya başlandığında ilk olarak default.master ve CSS dosyası bizlerin kullanımına sunulmaktadır. Farklı kullanıcı gruplarından hangi grup girerse farklı bir masterpage 'in açılmasına olanak tanıyabilmek için ilk olarak bu masterpage 'leri sharepoint e uygun şekilde düzenlemek gerekmektedir. Şimdi masterpage 'leri sisteme dahil olan kullanıcı grubuna göre nasıl değiştirebileceğimizi incelemeye başlayalım.

ASP.NET Sayfasının İçerisinde MasterPage Nasıl Değiştirilir?

ASP.NET uygulama geliştiriciler sisteme dahil olan üyelere göre rahatlıkla masterpage ve sayfa içerisinde yer alan öğeleri değiştiebiliyorlar. Sisteme dahil olan kullanıcıları kontrol etmek için masterpage 'in içerisinde yer alan PreInit event 'ından yararlanmak gerekmektedir. Fakat unutulmaması gereken bir nokta var. Hazırlanmış olan uygulama da yalnızca üç beş tane asp.net sayfa olmayacak. Yüzlerce sayfa olacaktır. Bu durumda her sayfaya ve masterpage 'e PreInit olayını yakalamak ve belirteceğimiz kodları yazmak sistemi yavaşlatacak bir etken olacaktır. Bu sebepte her sayfa için taban bir sınıf oluşturup yapacak olduğumuz işlemleri bunun içerisinde yaparsak işlerimiz biraz daha kolaylayacaktır. Bu sebeple MyCustomBasePage isimli bir sınıf oluşturuyoruz ve Page sınıfından bu sınıfı türetiyoruz. Sonrasında ise, Page_PreInit olayına aşağıdaki kodları ekliyoruz.

public class MyCustomBasePage : System.Web.UI.Page
{
    protected void Page_PreInit(object sender, EventArgs e)
    {
        if (CurrentUser.UserType == UserType.Admin)
        {
            MasterPageFile = "~/MasterPages/AdminMaster.master";
        }
        else if (CurrentUser.UserType == UserType.NormalAuthenitcated)
        {
            MasterPageFile = "~/MasterPages/NormalAuthenticatedMaster.master";
        }
        else
        {
            MasterPageFile = "~/MasterPages/AnonymouskMaster.master";
        }
    }
}

Bu sınıfın içerisinde üç farklı kullanıcı grubu için master page ayarladık. Admin, Normal ve sistem tarafından tanınmayan kullanıcılara göre farklı masterpage ler çalışacak ve görsel olarak farklı bir görünüm ile karşılacaklardır.

Şimdi bu sınıfı oluşturduğumuza göre işimiz biraz daha kolaylaştı. Artık oluşturulan bütün sayfalardan MyCustomBasePage sınıfını kullanarak bu hazırlamış olduğumuz kontrolün aktifleşmesine olanak tanırız.

public partial class HomePage : MyCustomBasePage
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }
}

Sharepoint İçerisinde MasterPage Nasıl Değiştirilir?

Ana mantık olarak web uygulamalarında her kullanıcı grubuna ya da değişik faktörlere göre masterpage 'i nasıl değiştrebileceğimizi biliyoruz. Biraz öncede incelemiştik. Harici bir sınıf oluşurulur ve sayfanın PreInit olayı yakalanılarak değişiklikler yapılabilirdi. Ancak Sharepoint içerisinde bu direk PreInit olayından yakalayabilmek dire mümkün değildir. Ancak bizden çözüm bekleniyor ve gerekli işlemleri yapmamız gerekmektedir. Sharepoint Sayfaları içerisinde PreInit olayını yakalayabilmek için HttpModule 'ün kullanılması gerekmektedir.

Asp.Net Pipeline Süreci

Asp.Net istek süreçleri pipeline mantığına göre işlemlerini sürdürmektedir. Aşağıdaki şekilde de göreceğiniz üzere her isteğe yanıt veren bir modül bulunmaktadır. İstekler yakalandıktan sonra gerekli modülün kullanılmasına olanak tanınır.



Genellikle istekler pipeline içerisinde yer alan modüller isteklere göre yanıt vermektedir. Eğer ki bir den fazla modüle istek yapılırsa da tek bir işleyici tarafında işlem yapılacaktır. Ancak bizim istediğimiz her modüle tek bir işleyicinin işlem yapmasıdır. Bu işlemide asp.net sayfasında PreInit olayı ile gerçekleştiririz.

HttpModule 'den yararlanarak PreInit Olayı İşlenmesinin Geliştirilmesi

HttpModule den yararlanarak bir sınıf geliştirilirken System.Web.IHttpModule sınıfı miraslanarak kullanılır. IHttpModule 'in iki tane metodu vardır. Bunlar Dispose ve Init 'dir. Init metodu başlatıldığında diğer aktif olan Initleri iptal ederek kendisini kullanmaya başlayacaktır.

public class DynamicMasterPageModule : IHttpModule
{
    public void Dispose()
    {
    }
    public void Init(HttpApplication context)
    {
        context.PreRequestHandlerExecute += new EventHandler(context_PreRequestHandlerExecute);
    }
    void context_PreRequestHandlerExecute(object sender, EventArgs e)
    {
                Page page = HttpContext.Current.CurrentHandler as Page;
           if (page != null)
           {
               page.PreInit += new EventHandler(page_PreInit);
           }
    }
    void page_PreInit(object sender, EventArgs e)
    {
    }
}

Init metodunun içerisinde yer alan PreRequestHandlerExecute event 'ını yakalıyoruz. Asp.net sayfa başlarken bu olay tetiklenir. Sonrasıda açılacak olan sayfanın null olup olmadığının kontrolü sonrasında asp.net 'ten alışık oluğumuz PreInit olayının tetiklenmesi işlemini gerçekleştirebilmemize olanak tanınır.

Sharepoint MasterPage

Sharepoint 'in kendi varsayılan bir masterpage 'i vardır. Eğer bu masterpage üzerinde bir değişiklik ya da düzenleme yapmak istersek Sharepoint içeriğini görüntülemeye olanak tanıyan Sharepoint Designer içerisinde düzenleme yapmak gerekmektedir. Eğer ki oluşturulan ya da düzenlenen masterpage 'i kod tarafından çağırmak istersek Page.MasterPageFile özelliğini kullanmak gerekmektedir.

Page.MasterPageFile = "Masterpage 'in uygulama içerisindeki yolu";

Ancak dikkat edilmesi gereken bir nokta vardır. Masterpage sharepoint içerisinde farklı yerlerde bulıunabilir. Peki neden? Varsayılan sitenin içerisindeki olabilir, site koleksiyonunda olabilir gibi yerlerde olabilmektedir. Bunları örneklemek gerekirse,

"~site/MasterPageName.master"
Site klasörünün içerisinde yer alan masterpage 'in yolunu birden fazla masterpage olacağı için ~site/MasterPages/Masterpagename.master şeklinde güncellemelidir. MasterPage 'in yolunu adres çubuğunda görüntülemek için ise, http://sitecollection/site1 'in altında yer alan masterpage adresinden http://sitecollection/site1/masterpages/MyMaster.master yoluna göre güncelleriz.

"~sitecollection/MasterPageName.master"
Burada ise masterpage ~sitecollection yolunun içerisinden erişilebilmektedir. Ana sitenin yolu http://sitecollection iken http://sitecollection/MasterPageName.master yolu ile erişebilmek mümkündür.

Sharepoint İçerisinde Özel MasterPage Kullanımı

Eğer Sharepoint ile uygulama geliştirirken Sharepoint Designer yardımı ile yaparız. Özel bir masterpage oluşturmanın en kolay yolu var olan bir masterpage i tekrardan kopyalayarak yapıştırdıktan sonra gerekli düzenlemeleri yaparız.

Özel bir masterpage 'i oluşturduktan sonra diğer otomatik olarak bunun özel olarak oluşturulan bir masterpage olduğunu Sharepoint direkt anlamaz. Bu işlemi yapabilmek için Sharepoint Designer üzerinden de hazırlanan masterpage 'in üzerinde sağ tıklama yaparak bunu özel bir masterpage olduğunu belirten "Set as Custom Master Page" 'e tıklayarak belirtiriz.



Artık PreInit olayını yakaladıktan sonra web.config içerisinde MasterPage numarasını alıyoruz. Sonrasında eğer gelen sayfa numarası 1 ise custom1.master eğer gelen sayfa numarası 2 ise custom2.master 'ı aktif duruma getiriyoruz.


void page_PreInit(object sender, EventArgs e)
{
    Page page = sender as Page;
    string pageNo = ConfigurationManager.AppSettings["MasterPageNo"];


    if (page != null)
    {
        if (pageNo.Equals("1"))
            {
                page.MasterPageFile = "~masterurl/custom.master";
                if (SPContext.Current != null)
                {
                    SPContext.Current.Web.CustomMasterUrl = "/_catalogs/masterpage/custom1.master";
                }
            }
            else if (pageNo.Equals("2"))
           {
               page.MasterPageFile = "~masterurl/custom.master";
               if (SPContext.Current != null)
               {
                    SPContext.Current.Web.CustomMasterUrl = "/_catalogs/masterpage/custom2.master";
               }

           }
           else
           {
                page.MasterPageFile = "~masterurl/default.master";
                if (SPContext.Current != null)
               {
                    SPContext.Current.Web.MasterUrl = "/_catalogs/masterpage/default.master";
               }
       }

}

web.config 'den gelen değere göre hangi masterpage 'in geleceği dinamik olarak görüntülenmektedir. Bu işlemi işinizi görecek şekilde güncelleyerek sorunlarınızı kolayca çözebilirsiniz.

Sonuç olarak bu yazımızda belirli kriterler doğrultusunda sharepoint server portal in masterpage 'ini dinamik olarak nasıl değiştirebileceğimizi incelemeye çalıştık.

Umarım yararlı olabilmiştir.

Pazar, Eylül 06, 2009

Asp.Net MVC Framework - Validation İşlemleri - II

Günler geçtikçe ASP.NET MVC Framework hem ülkemizde hem de dünyada yayılmaya devam etmektedir. Geliştirdiğimiz web projelerinin geliştiriciler tarafında hızlı geliştirilebilmesine sağladığı olanaklar ve çalışma zamanındaki performansı ile tercih sebebi olma yolunda emin adımlarla ilerlemektedir. Ayrıca MVC kalıbını yıllardır web kullanıcıları kullanıyordu. Ancak ASP.NET MVC Framework ile birlikte gelen hazır özelliklerin bir çoğunu kendimiz oluşturmak durumunda kalıyorduk. Bu da bize MVC Framework ile geliştirdiğimiz uygulamaların geliştirilebilirliğinin daha da kolay olduğunun ufak bir göstergesidir.

ASP.NET MVC Framework ile yapılabilecekleri ufak örnekler yardımı ile bir süredir inceliyoruz. Bu sefer ise bir önceki yazımızda incelemiş olduğumuz Validation kontrollerini devam yazısı ile incelemeye devam ediyoruz. Bu yazımızda ModelState.AddModelError() ile yapmış olduğumuz hata kontrolünü kendi hazırlayacak olduğumuz sınıf yardımı ile nasıl yapabileceğimizi incelemeye çalışacağız.

Validation kontrolünü yine bir örnek ile inceleyelim ve veri tabanında ders tablosu oluşturalım.

mak60_1
Tabloyu oluşturduktan sonra bir MVC projesi oluşturacağız. Sonrasında ise projeye Entity Framework özelliklerinden yararlanmak için Entity Data Model ekleyeceğiz.

mak60_2
Not: Entity Model ile çalışırken unutulmaması gereken en önemli noktalardan biri model üzerine eklemiş olduğumuz tablo objelerinin isimlerinin veri tabanı ile aynı olmamasıdır. Bu sebepte veri modeline attıktan sonra ismini değiştiriyoruz. Bu açıkladığımız konuları uygularken zorluk yaşıyorsanız daha önce yayınlamış olan ilişkisel yazıları okuyabilirsiniz.

Temel işlemleri yapmaya devam ediyoruz. Diğer yazılarımızda da sıklıkça değindiğimiz verilerin getirilmesi ve yeni bir kayıt oluşturulması durumunda gerçekleşecek işlemleri sağlayacak metotları hazırlayalım. İş katmanı Controller olduğuna göre ve bu işleri ana sayfa üzerinde hazırlayacağımıza göre HomeController içerisinde bahsettiğimiz işlemleri gerçekleştiriyoruz.

using System.Linq;
using System.Web.Mvc;
using ValidationIslemler.Models;

namespace ValidationIslemler.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        private MVCArticleEntities _db = new MVCArticleEntities();
        public ActionResult Index()
        {
            return View(_db.OgretimUyesSet.ToList());
        }

        public ActionResult Create()
        {
            return View();
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Create([Bind(Exclude = "id")] OgretimUyes yeniOgretimUyesiEkle)
        {
            if (!ModelState.IsValid)
                return View();

            try
            {
                _db.AddToOgretimUyesSet(yeniOgretimUyesiEkle);
                _db.SaveChanges();

                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }

        public ActionResult About()
        {
            return View();
        }
    }
}

Daha önceki yazılarımızda Create metodunu otomatik olarak oluşturur ve içerisinde yazılması gereken işlemleri bizler doldururduk. Fakat bu işlemi direk bizde yapabiliriz. Yeni kayıt işleminin gerçekleşebilmesi için iki adet create metoduna ihtiyaç vardır. Birincisi create edilecek değer bulunamazsa geldiği view 'a döndürür. Bir diğeri ise Create işlemini gerçekleştiren bölümdür. Dikkat edeceğiniz üzere ikinci Create metodunda gelen verinin modele uyumluluğunu da kontrol ediyoruz. Bu durumda ilk Validation kontrolünü gerçekleştirmiş oluyoruz. Bu kontrol esnasında ModelState değeri negatif dönerse yeni kayıt oluştur linkine tıklanan sayfaya geri dönecektir. Ayrıca bu durumda hataya düşüyorsanız elle ya da otomatik olarak oluşturmuş olduğunuz HTML sayfanın Model 'den veri aldığına emin olarak işlemlerinizi gerçekleştirebilirsiniz.

Yazımızın başında da bahsetmiştik, model üzerinde veri kontrollerini yapmak için gerekli işlemleri nasıl oluşturacağımızı inceliyor olacaktık. Bu aşamada ilk olarak projeye eklemiş olduğumuz Ado.Net Entity Model 'in design tarafında otomatik olarak oluşturulmuş olan cs koda göz atalım.

mak60_3

Gördüğümüz kadarı ile model içerisinde erişebildiğimiz sınıflar partial class olarak tanımlanmaktadır. Peki, "partial class neydi?" kısaca hatırlamak gerekirse;

Partial classların ne olduğunu kısaca hatırlamak gerekirse; fiziksel olarak yada aynı fiziksel dosyada (amacına göre ayrı iki .cs dosyasında olması makbul ve mantıklıdır) tanımlanan class tanımlarının tek bir class olarak çalışması ve derlenmesidir. Yani aslında bir sınıfın metotların farklı .cs dosyalarında tanımlayabilmeyi sağlar.

Bu durumda IDataErrorInfo ara yüzünü kullanabileceğimiz sınıfı partial olarak oluşturup içeriğini düzenleyeceğimiz duruma getiriyoruz. Model katmanının içerisine yeni bir sınıf ekliyoruz.

Models\OgretimUyesi.cs
using System.Collections.Generic;
using System.ComponentModel;

namespace ValidationIslemler.Models
{
    public partial class OgretimUyesi
    {

    }
}

Entity Framework ile hazırlanmış olan data modelde partial sınıflar otomatik olarak oluşturulmaktadır. Entity Framework ile oluşturulan kodlarda otomatik olarak OnChanging ve OnChanged partial sınıfları oluşturulur.

Şimdi bizde oluşturmuş olduğumuz sınıfın içerisine Aşağıdaki metotları ekleyelim.

•OnIdChanging
•OnIdChanged
•OnAkademisyenChanging
•OnAkademisyenChanged
•OnUnvanChanging
•OnUnvanChanged
•OnDersSaatiChanging
•OnDersSaatiChange

OnChanging metotları OnChanged metotlarını tetikleyerek çalışır ve güncelleme işlemlerinde ID özelliklerinden yararlanarak bizim istediğimiz değişiklikleri yapamabilmemize olanak tanır.

Şimdi yukarıdaki bilgilerimizden yararlanarak eklemiş olduğumuz partial sınıfı biraz düzenleyelim. Yapacak olduğumuz değişiklikler ile son kullanıcının web form üzerinden Akademisyen ve Unvan bilgilerini boş girmemesi için gerekli olan kod parçasını oluşturalım.

Yazımızın içerisinde daha öncede bahsettiğimiz gibi Validation işlemlerini yaptığımız durumlarda IDataErrorInfo ara yüzünün özelliklerinden yararlanarak çok daha işlevsel bir hata kontrolü yapabilmemiz mümkündür.

using System.Collections.Generic;
using System.ComponentModel;

namespace ValidationIslemler.Models
{
    public partial class OgretimUyesi:IDataErrorInfo
    {
        private Dictionary<string, string> _errors = new Dictionary<string, string>();

        partial void OnAkademisyenChanging(string value)
        {
            if (value.Trim().Length == 0)
                _errors.Add("Akademisyen", "Akademisyen bilgisi boş geçilemez.");
        }

        partial void OnUnvanChanging(string value)
        {
            if (value.Trim().Length == 0)
                _errors.Add("Unvan", "Unvan bilgisi boş geçilemez.");
        }
    }
}

Yapmış olduğumuz işlem sonrasında örneğin akademisyen bilgisi boş geçildiğinden _errors Dictionary<> 'sine hata mesajı yazılacak ve kullanıcıya gösterilecektir.

IDataErrorInfo ara yüzü ile oluşturmuş olduğumuz sınıfı birlikte kullanmamız da gerekmektedir. Zaten OgretimUyesi sınıfına ara yüzü eklediğimiz zaman bize otomatik olarak aşadağıki metotları getirmektedir. Bakalım IDataErrorInfo ara yüzünün içerisinde hangi metotlar yer almaktaymış.

public interface IDataErrorInfo
{
    string this[string columnName] { get; }

    string Error { get; }
}

HomeController içerisinde oluşturmuş olduğumuz Crete() kontrolüne ilişkin kontrolleri üzerinde değişiklik yaptığımız OgretimUyesi.cs üzerinde IDataErrorInfo ara yüzünden yararlanarak Validation kontrolleri işlemlerini gerçekleştirdik.

OgretimUyesi sınıfının içerisinde eğer Akademisyen ve Unvan alanları boş geçilirse verilecek olan hata belirtilmiştir. Boş geçilmesi durumunda kolon adını kontrol edecek olan IDataErrorInfo ara yüzü olacaktır. Bu durumda ara yüze ilişkin özelliklerden error 'a istediğimiz kontrol sonucunda hata oluşursa son kullanıcının sayfasında görüntülenmesine olanak tanırız. Ayrıca hata olması sonucunda geri dönüş değeri olarak boş string döndürelim.

Şimdi yukarıda açıklamış olduğumuz özelliklere göre IDataErrorInfo ara yüzü ile ilişkilendirelim ve özelliklerine gerekli değerleri atayalım.

using System.Collections.Generic;
using System.ComponentModel;

namespace ValidationIslemler.Models
{
    public partial class OgretimUyesi : IDataErrorInfo
    {
        private Dictionary<string, string> _errors = new Dictionary<string, string>();

        partial void OnAkademisyenChanging(string value)
        {
            if (value.Trim().Length == 0)
                _errors.Add("Akademisyen", "Akademisyen bilgisi boş geçilemez.");
        }

        partial void OnUnvanChanging(string value)
        {
            if (value.Trim().Length == 0)
                _errors.Add("Unvan", "Unvan bilgisi boş geçilemez.");
        }

        #region IDataErrorInfo Members

        public string Error
        {
            get { return string.Empty; }
        }

        public string this[string columnName]
        {
            get
            {
                if (_errors.ContainsKey(columnName))
                    return _errors[columnName];
                return string.Empty;
            }
        }

        #endregion
    }
}

Artık özellikler sonrasında boş geçilen değerler _errors koleksiyonuna eklecek ve son kullanıcı sayfasında gösterilecektir.

Bu arada yazımız boyunca yaptığımız bütün işlemleri OgretimUyesi sınıfının içerisinde yaptığımızı ve HomeController sınıfında hiç bir değişiklik yaptığımızı unutmayalım.

Sonuç olarak neler yaptığımızı tekrardan bir üstünden geçmek gerekirse, IDataErrorInfo ara yüzü yardımı ile otomatik olarak gösterilen kontrol mesajlarını nasıl oluşturabileceğimize göz attık. Daha sonrasında ise OnAkademisyenChanging() ve OnUnvanChanging partial metotlarını OgretimUyesi sınıfına ekledik. Bu eklediğimiz metotlar yardımı ile Asp.Net MVC Framework uygulamalarında kendimize özgü Validation mesajlarını nasıl gösterebileceğimizi öğrenmiş olduk.

Umarım yararlı olabilmiştir.

Turhal Temizer
info@turhaltemizer.com

Pazartesi, Ağustos 31, 2009

C# Keyword

abstract as base bool break
Byte case catch char checked
delegate do double else enum
event explicit extern false finally
fixed float for foreach goto
if implicit in int interface
internal is lock long namespace
new null object operator out
override params private protected public
readonly ref return sbyte sealed
short sizeof stackalloc static string
struct switch this throw true
try typeof uint ulong unchecked
unsafe ushort using virtual volatile
void while      

Çarşamba, Temmuz 08, 2009

Asp.Net MVC Framework - Master Pages Kavramı - I

Microsoft 'un web projelerini hazırlarken bizlere mimari tasarıları daha basit ve kullanışlı bir biçimde kullanmamızı sağlayan Asp.Net MVC Framework 'ü daha önceki yazılarımızda detaylı bir biçimde tanımaya çalıştık. Peki neler yapabiliyorduk. Son kullanıcıdan gelen istekler doğrultusunda başka bir sayfaya nasıl yönlendirebileceğimizi, Controller katmanı ile veri tabanı işlemlerini nasıl işleyip görsel sayfaya ileteceğimizi, model katmanı yardımı ile veri tabanı ile haberleşmelerin çok daha basit bir şekilde yapılabileceğini, veri tabanını aktif olarak kullandığımızda nasıl bir uygulama geliştirdiğimizi ve view sayfaları nasıl kolayca oluşturabileceğimizi detaylı olarak daha önceki yazılarımızda inceledik ve neler yapabileceğimizi gördük. Ayrıca uygulamalarımızda MVC tasarımını kullandığımızda daha önceden oldukça fazla uğraştığımız işlemleri ne kadar kolaylıkla yapabildiğimizi defalarca yapmış olduğumuz pratiklerde doğrulamış olduk. Bu yazımızda ise Asp.Net sayfalarında tasarım standardı açısından sıkça kullandığımız Master Pages kavramını MVC Framework 'te kullanım yapısını detaylı olarak inceliyor olacağız.

Asp.Net uygulamaların Master Page kullanmamızın sebebini kısaca hatırlayacak olursak. Benzer tarzda tasarım şablonu kullanacak olduğumuz sayfalarda tekrardan o tasarımsal öğeleri serverdan çağırıp sayfa üzerinde yüklenmemesini beklememek için oluşturulmuş başarılı bir yapıdır. Özellikle tasarım yapısı üzerinde herhangi bir değişiklik yok ise ve sadece içerikler değişecekse çok önemli bir tercih durumundadır. Aynı Asp.Net uygulamalarında olduğu gibi MVC uygulamalarında da Master Page kavramı önemli bir yer tutmaktadır. Varsayılan olan mavi bir tasarımı olan Master Page kullanılmaktadır. Peki biz bu tasarımı değil de kendi tasarımımızı Master Page 'e taşımak istersek neler yapmamız gerekir. Gelin hep birlikte bunu incelemeye çalışalım.

Her zaman olduğu gibi ilk olarak yapmamız gereken Visual Studio 2008 SP1 geliştirme ortamında bir Asp.Net MVC Framework Web uygulaması oluşturuyoruz. Proje dosyasının içerisinden ilk olarak varsayılan olarak oluşturulan Master Page 'in yerini bulalım.



MVC tasarımını dikkate alarak araştırmalarımızı yaptığımızda görsel öğelerin view katmanında olduğunu görürüz. Master Page her yerde kullanılacak bir içerik olduğu içinde view içerisinde Shared klasörünün içerisinde yer alır.

Biz uygulamamızda bu otomatik olarak oluşturulan Master Page 'i kullanmak yerine kendimize bir tane oluşturalım. Ama ilk olarak oluşturulmuş olan Site.Master 'ı siliyoruz. Sonrasında da Add- NewItem yolunu izleyerek web sitesine yeni bir Master Page ekliyoruz.



Master Page 'i sorunsuzca projeye ekledikten sonra nasıl bir içerik oluşturulacağının düşünülmesinin zamanı gelmiştir. Basit olması açısında içeriğe göre değiştirilebilir iki sütun ekleyelim. Bu değişen içerik eklemeyi Asp.Net 'ten de alışık olduğu gibi <asp:ContentPlaceHolder> yardımı ile yapacağız. İçeriği arttırdıktan sonra temel CSS ile Master Page 'in içerisine stil özellikleri de ekliyoruz ve bu yaptığımız işlemler sonrasında elimizdeki değişikler aşağıdaki gibi olacaktır.

View\Shared\Site.Master
<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
   <title><asp:ContentPlaceHolder ID="TitleContent" runat="server" /></title>

   <style type="text/css">
      html
      {
         background-color:Gray;
      }

      .column
      {
         float:left;
         width:300px;
         border:solid 1px black;
         margin-right:10px;
         padding:5px;
         background-color:white;
         min-height:500px;
      }

   </style>
   <asp:ContentPlaceHolder ID="head" runat="server">
   </asp:ContentPlaceHolder>
</head>
<body>
   <h1>Sitem</h1>

   <div class="column">
      <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
      </asp:ContentPlaceHolder>
   </div>
   <div class="column">
      <asp:ContentPlaceHolder ID="ContentPlaceHolder2" runat="server">
      </asp:ContentPlaceHolder>
   </div>
</body>
</html>

Eklemiş olduğumuz içerik kontrollerini body 'nin içerisine <div> taglarının arasına yerleştiriyoruz. Ayrıca div taglarının sütün gibi hareket etmesi için stil özelliğine daha önceden hazırlamış olduğumuz column 'u tanımlıyoruz. Yaptığımız bu işlemler sonucunda Master Page 'in görünümü aşağıdaki gibi olacaktır.



Basit fakat bizlerin hazırlamış olduğu bir Master Page 'e sahip olduk.

Master Page 'i Kullanan View Sayfa Oluşturmak

Asp.Net uygulamalarında Master Page 'ten yararlanarak web sayfaları oluşturabilmemiz mümkündü. Bunun bize en büyük yararı oluşturmuş olduğumuz sayfalarda Master Pages üzerinde belirtmiş olduğumuz içerik kontrol alanlarının düzenlenebilmesi ve diğer taraflar üzerinde herhangi bir değişiklik yapmadan hazırlıyor olmamızdır. MVC Framework 'ten yararlanarak hazırlamış olduğumuz web sayfalarında da Master Page Asp.Net uygulamalarında olduğu gibi kullanılmaktadır.

View klasörünün içerisinde yer alan Home klasörünün üzerinde sağ tıklama sonrasında karşımıza gelen menüden Add - NewItem seçeneğine tıklayarak ekrandan MVC View Content Page i seçerek Master Page 'i kullanabileceği bir web sayfa oluşturmaya başlıyoruz.


Sayfa tipimizi seçip ekle dediğimizde hazırlamış olduğumuz Master Page 'ler den istediğimizi seçmek için bir ekran çıkacaktır.


Tamam dedikten sonra artık Master Page 'i kullanan bir web sayfası uygulamamızda oluşturulmuş olacaktır. Oluşturulan sayfanın arka plan kodları aşağıdaki gibi oluşturulmuştur.

View\Home\Index.aspx
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="head" runat="server">
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
</asp:Content>
<asp:Content ID="Content4" ContentPlaceHolderID="ContentPlaceHolder2" runat="server">
</asp:Content>

Standart olarak projelere eklenmiş olan *.aspx sayfalardan farklı olarak HTML ve Body tagları yer almaktadır. Bu taglar Master Page de oluşturulduğu için yalnızca belirttiğimiz içerik kontrol alanları sayfada gözükmüştür ve sayfa içerisinde kullanıcılara göstermek istediğimiz içerikleri buralardan yayınlarız. Örnek olması açısında body taglarının içerisine eklemiş olduğumuz <asp:content> 'lerin içerisinde biraz değişiklik yaparak aldığımız sonuca hep birlikte çok atalım.

View\Home\Index.aspx
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="head" runat="server">
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
   İlk içerik kontrol alanı
</asp:Content>
<asp:Content ID="Content4" ContentPlaceHolderID="ContentPlaceHolder2" runat="server">
   İkinci içerik kontrol alanı
</asp:Content>

Yaptığımız düzenleme sonrasında ekran değişikliğimiz aşağıdaki gibi olacaktır.



Yapılmış olan değişikler sonrasında web sayfamızın içeriği istediğimiz gibi olmuştur.

Master Page yardımı ile oluşturulan view sayfanın içeriğini düzenlemek

İlk olarak düzenleme yapağımız yer sayfamızın başlığı olacaktır. Oluşturmuş olduğumuz web sayfası internet tarayıcısında açıldığında pencerenin en üst kısmında yer alan bölümü düzenleyelim. Asp.Net ten ve diğer bütün web sayfası kodlama yapılarından alışık olduğumuz üzere title bölümünde belirtmemiz yeterli olacaktır.

Sayfamızın markup kod tarafında en üstte yer alan <Page> </Page> bölümün aralığının içerisinde yer alan title özelliğini değiştirerek sayfa başlığını sorunsuzca oluşturmuş oluruz.


Yapmış olduğumuz işlemi hazırlanmış olan Master Pages ile ilişkilendirerek tekrardan yapalım. Bu durumda ilk olarak oluşturulan Master Pages içerisine koyduğumuz içerik kontrol alanlarını hatırlamamız gerekir ve bir tane head bölümünün içerisine <asp:contentplaceholder> ekledik. Alana başlık, meta ve diğer birçok kriteri ekleyebilmemiz mümkündür. Bu özellikten yararlanarak aspx sayfasının içerisinde aşağıdaki değişiklikleri uyguluyoruz.

View\Home\Index.aspx
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
   <title>Başlık buraya yazılacak</title>
   <meta name="description" content="İçindekiler buraya" />
   <meta name="keywords" content="ana arama kriterleri buraya" />

</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="head" runat="server">
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
   İlk içerik kontrol alanı
</asp:Content>
<asp:Content ID="Content4" ContentPlaceHolderID="ContentPlaceHolder2" runat="server">
   İkinci içerik kontrol alanı
</asp:Content>

Asp.Net uygulamaları ile uygulamadığımız tekniklerin birebir aynısıdır. Bu örneklerin bu kadar detaylı olarak gösterilmesinin sebebi Master Pages kavramının temel yapısının alışık olduğumuz Asp.Net Master Pages kavramından bir farkının olmadığını da göstermek amacıyladır. Yapmış olduğumuz işlemler sonrasında karşımıza gelen ekran görüntüsü aşağıdaki gibi olacaktır.



Yaptığımız işlemler sonucunda gayet başarılıyız. :)

Bu yazımızda Asp.Net MVC Framework ile hazırlanmış olan uygulamalarda Master Pages kavramını nasıl kullanabileceğimizi ve içerik düzenlemelerini nasıl kullanabileceğimizi detaylı bir biçimde incelemeye çalıştık. Bir sonraki MVC Framework yazımızda Master Pages kavramını incelemeye devam ederken veri tabanı işlemleri ile ilişkilerine de detaylı bir biçimde değineceğiz.

Umarım yararlı olabilmiştir.
info@turhaltemizer.com

Perşembe, Haziran 18, 2009

Silverlight 2.0 – SQL İşlemleri için WCF ve Linq To SQL Kullanım

Silverlight uygulamları RIA yapısında oldukları için direk sql işlemleri ile çalışmak yerine bunları bir servis olarak oluşturup kullanmamız önerilmektedir. Bu sebepten ötürü veri tabanı işlemlerimizi yapmak için ister Linq Data Model oluşturduktan sonra WCF servisine querynin yapılacağı metota bağlyoruz. Sonrasında Silverlight projesine Web service referance olarak ekledikten sonra gerekli işlemleri yaparak istediğimiz data kontrollerine ekleyebilinmesi mümkündür.

Sırası ile yapılması aşağıdaki adımları uygularsanız sizin projenizde sorunsuz bir biçimde çalışacaktır.

  • Silverlight projesi oluşturuyoruz.
  • Oluşturulan web projesine Linq To SQL Data Model ekliyoruz.
  • Oluşturulan web projesine WCF Service ekliyoruz ve aşağıdaki kodları interface ve sınıfa ekliyoruz.

IService1.cs

using System.Collections.Generic;
using System.ServiceModel;

namespace SQLData.Web
{
    // NOTE: If you change the interface name "IService1" here, you must also update the reference to "IService1" in Web.config.
    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        List<Customer> GetCustomerGetByLastName(string lastName);
    }
}

Service1.cs

using System.Collections.Generic;
using System.Linq;

namespace SQLData.Web
{
    // NOTE: If you change the class name "Service1" here, you must also update the reference to "Service1" in Web.config.
    public class Service1 : IService1
    {

        #region IService1 Members

        public List<Customer> GetCustomerGetByLastName(string lastName)
        {
            var ctx = new DataClasses1DataContext();
            var matchingCustomer = from cust in ctx.Customers
                                   where cust.LastName.StartsWith(lastName)
                                   select cust;
            return matchingCustomer.ToList();
        }

        #endregion
    }
}

  • Yukarıdaki işlemleri gerçekledikten sonra webconfigte ws service content özelliğini basic olarak değiştiriyoruz.
  • Uygulamayı derliyoruz.
  • Sİlverlight uygulaması üzerine ilk olarak Silverlight.Data.Control assembly ‘ını projeye ekliyoruz. Bu işlem silverlight uygulamasında DataGrid kontrolünü kullanabilmenize olanak tanıyacaktır.
  • Silverlight uygulamasına WCF service ini referans olarak ekliyoruz.
  • Sonrasında Page.xaml ve page.xaml.cs ‘e aşağıdaki kod bloklarını ekliyoruz

Page.xaml

<UserControl x:Class="SQLData.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:my="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
    Width="700" Height="300">
    <Grid x:Name="LayoutRoot" Background="White" ShowGridLines="True">
        <Grid.RowDefinitions>
            <RowDefinition Height="30"/>
            <RowDefinition />
            <RowDefinition Height="30" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>       
        <TextBlock Text="Lütfen Arayacağınız kişinin soyadını giriniz.." Grid.Column="0" Grid.Row="0" HorizontalAlignment="Left"/>
        <TextBox x:Name="txtLastName" Grid.Row="0" Grid.Column="0" HorizontalAlignment="Right" Width="150" Text="Lütfen arayın..."/>
        <my:DataGrid x:Name="grd" AlternatingRowBackground="Beige" AutoGenerateColumns="True" Width="700" Height="200" CanUserResizeColumns="True" Grid.Row="1"/>
        <Button x:Name="btnClick" Grid.Row="2" HorizontalAlignment="Center" Content="Ara"/>
    </Grid>
</UserControl>

Page.xaml.cs

using System;
using System.Windows;
using System.Windows.Controls;

namespace SQLData
{
    public partial class Page : UserControl
    {
        public Page()
        {
            InitializeComponent();
            Loaded += new RoutedEventHandler(Page_Loaded);
        }

        void Page_Loaded(object sender, RoutedEventArgs e)
        {
            btnClick.Click += new RoutedEventHandler(btnClick_Click);
        }

        void btnClick_Click(object sender, RoutedEventArgs e)
        {
            ServiceReference1.Service1Client webService = new SQLData.ServiceReference1.Service1Client();
            webService.GetCustomerGetByLastNameCompleted += new EventHandler<SQLData.ServiceReference1.GetCustomerGetByLastNameCompletedEventArgs>(webService_GetCustomerGetByLastNameCompleted);
            webService.GetCustomerGetByLastNameAsync(txtLastName.Text);
        }

        void webService_GetCustomerGetByLastNameCompleted(object sender, SQLData.ServiceReference1.GetCustomerGetByLastNameCompletedEventArgs e)
        {
            grd.ItemsSource = e.Result;
        }
    }
}

Yukarıdaki işlemleri adım adım yaptıktan sonra projemizi çalıştırdığımız da sorunsuzca uygulamamız çalışacaktır. Yaptığımız işlem ise soyadını girdiğimiz kullanıcıları DataGrid kontrolünde listelemektir.

Not: Linq To Sql Data Model de SQL Server 2008 veri tabanı örneklerinden AdventureWorks_LT veri tabanından Customer tablosunu kullandık.

Herkese mutlu günler diliyorum.

Çarşamba, Haziran 17, 2009

Silverlight 2.0 – Çalışma Anında Otomatik Kontrol Eklenmesi

Silverlight web forma eklemiş olduğumuz button kontrolü yardımı ile sınırsız button kontrolü eklenmesini açıklayan XAML ve C# kodunu vereceğim. Bu örneği kullanarak diğer kontrolleri de ekleyebilmeniz mümkündür.

XAML
<UserControl x:Class="Controls.Page"
    xmlns="
http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Width="400" Height="300">
    <Canvas x:Name="myCanvas">
        <Button x:Name="btnIsMy" Content="Oylesine duruyor..." Canvas.Left="10" Canvas.Top="10"/>
        <Button x:Name="btnAnother" Content="Another" Canvas.Left="10" Canvas.Top="30"/>
        <CheckBox x:Name="rushOrder" Content="Rush" Canvas.Left="10" Canvas.Top="50"/>
    </Canvas>
</UserControl>

C#
using System.Windows;
using System.Windows.Controls;

namespace Controls
{
    public partial class Page
    {
        public Page()
        {
            InitializeComponent();
            btnAnother.Click += BtnAnotherClick;
        }

        private double _newButtonPosition = 100.0;

        void BtnAnotherClick(object sender, RoutedEventArgs e)
        {
            var b = new Button {Content = "Ben yaşıyorum"};
            b.SetValue(Canvas.LeftProperty, 10.0);
            b.SetValue(Canvas.TopProperty, _newButtonPosition);
            _newButtonPosition += 30.0;
            b.Width = 100;
            b.Height = 20;
            b.IsEnabled = true;
            b.Click += b_Click;
            myCanvas.Children.Add(b);
        }

        static void b_Click(object sender, RoutedEventArgs e)
        {
            var btn = sender as Button;
            if (btn == null) return;
            btn.Content = "Basma...";
            btn.IsEnabled = false;
        }
    }
}

Umarım yararlı olabillr. İyi çalışmalar…

Cuma, Mayıs 22, 2009

Asp.Net MVC Framework - Controller ve Action Kavramı

Asp.Net MVC Framework web projesi şablonunu incelerken başlattığımız yazı dizimize Controller katmanına daha detaylı değinerek devam ediyor olacağız.

MVC Framework ‘te en önemli parçalarından biride Controller ‘dır. MVC patterninde son kullanıcılar tarafında yapılan istekler doğrultusunda route map yardımıyla gerekli controller sınıfına yönlendirerek işlemleri gerçekleştirmeye başlatır. Controller üzerinde modelle ilişkili olarak veri tabanı işlemleri, yönlendirme işlemleri, hesap işlemleri gibi bir web sitesi için en temel işlemlerin yapıldığı katmandır.

Controller ‘ı Anlamak

Asp.Net MVC ‘ de kullanıcılar tarafında gelen istekleri alan işleyen ve geri ileten katman olarak tanımlayabiliriz. İnternet tarayıcısında parçalı olarak her controller için ayrı bir istek yapılır. Ufak bir örnek adres üzerinden değinmek gerekirse;

http://localhost/Urun/Index/7 başarılı bir gösterim olabilir.

Controller adı adres çubuğunda Urun olarak geçmektedir. Bu Controllers\ klasörünün alt dizininde yer alan UrunController.cs sınıfından gelmektedir. Bu sınıf gelen isteklere karşı gerekli sonuçları döndürmek için kullanılmaktadır. Controller ların bir diğer özelliği ise yapılan bir işlem sonrasında işlenecek daha parçalar var ise başka bir controller sınıfına aktarmaktadır.

Basit olarak UrunController.cs sınıfına göz atalım;

Controller\UrunController.cs
using System.Web.Mvc;
using System.Web.Mvc.Ajax;

namespace MvcApplication1.Controllers
{
    public class UrunController : Controller
    {
         //
         // GET: /Urun/

         public ActionResult Index()
         {
              // Add action logic here
              return View();
          }

     }
}

Harici olarak oluşturulan controller sınıfları System.Web.Mvc.Controller sınıfı miraslanarak oluşturulmaktadır. Ayrıca controller sınıflarında oluşturulan metotlarda en çok dikkatimizi çeken Action kullanımıdır.

Action ‘ı Anlamak

Controller sınıflarını daha da işlevsel kılan Action kullanımıdır. Son kullanıcıdan gelen istek doğrultusunda hangi işlemi yapacağını belirtilen controller sınıfında yer alan metodlar yani action ‘lar yapmaktadır.

http://localhost/Urun/Index/7 adres çubuğunda Urun kontrollerken Index/7 belirtilen meto da 7 parametresine göre işlem yapması anlamına gelmektedir.

Controller ‘ı incelerken vermiş olduğumuz kod bloğunu örnek olarak kullanırsak, UrunController sınıfında yer alan Index() metodunu action ‘dır. Action public metot olmalıdır. C# metodları varsayılan olarak private oluşturulmaktadır. Bu sebepten ötürü action metotlarının public olarak belirtilmesi gerekmektedir.

Action metotlarının aşırı yüklenmesi kabul gören bir kullanım biçimi değildir. Action özellikle daha özelleştirilmiş kullanıma odaklandığı için benzer metot isimleri ile birden fazla işlem yapılması çalışma zamanında sorunlara sebep olabilmektedir.

Action Result ‘ı Anlamak

Controller da kullanılan action lar action result ile geri dönüşleri vardır.

1. ViewResult: HTML ve Markup sunar (Represent).
2. EmptyResult: Sunumu sonlandırır.
3. RedirectResult: Sunulan linki yeni bir adrese yönlendirmeye yarar
4. JsonResult: Java Script Object ‘leri Ajax ile birlikte kullanılabilir bir duruma getirir.
5. JavaScriptResult: Java Script leri sayfada kullanılabilir biçimde sunar.
6. ContentResult: Metin içeriği sunar.
7. FileContentResult: İndirilebilir dosyaları sunar (Binary içerik ile).
8. FilePathResult: İndirilebilir dosyaları sunar (Dosya yolu ile).
9. FileStreamResult: İndirilebilir dosyaları sunar (Stream dosyalar için).
View result kullanılarak hazırlanmış bir metoda göz atalım.

Controller\KitapController.cs
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class KitapController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
    }
}

Action sonucunda ViewResult ile HTML view ‘e dönecektir. Index() metodunda view adına göre geri dönüşü yapacaktır.

ViewResult() ve View() metotları Controller sınıfında türetilerek oluşturulmuştur. Controller ‘ın temel sınıfları;

1. View: Action sonucunda ViewResult ‘a yönlendirilir.
2. Redirect: Action sonucunda RedirectResult ‘a yönlendirilir.
3. RedirectToAction: Action sonucundan RedirectToRouteResult ‘a yönlendirilir (action yardımıyla yönlendirilir).
4. RedirectToRoute: Action sonucunda RedirectToRouteResult ‘a yönlendirilir (route yardımıyla yönlendirilir).
5. Json: JsonResult döndürür.
6. JavaScriptResult: JavaScriptResult döndürür.
7. Content: Action işlemi sonucunda ActionResult döndürür.

İnternet tarayıcılarında Controller üzerinde action çağırıldığında View() metodu kullanılmaktadır. Kullanılan bir diğer Action metodu ise RedirectToAction ‘dır. Bu metot yapılan işlemler doğrultusunda geri dönülmesi gerekiyorsa kullanılmaktadır.

Eğer ki Details metodunda ki id parametresine gelen değer HasValue ‘dan farklıysa bizim belirttiğimiz bir view HTML sayfaya yönlendirilmesini talep eden bir controller sınıfı hazırlayalım.

Controller\KullaniciController.cs
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class KullaniciController : Controller
    {
        public ActionResult Details(int? id)
        {
              if (!id.HasValue)
                   return RedirectToAction("Index");
              return View();
        }

        public ActionResult Index()
        {
            return View();
        }
    }
}

Şimdi vereceğimiz örnek ise içeriklerin gösterimi ile ilgili. Index metodunda ContentResult metodunu kullanarak belirtilen içerisi göstermektedir.

Controller\DurumController.cs
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class DurumController : Controller
    {
        public ActionResult Index()
        {
            return Content("Merhaba Dunya!!!");
        }
    }
}

İçeriği ContentResult metodu da bizim girebilmemiz dışında oluşturulan metotların geri dönüş değerlerine göre de otomatik olarak belirtilebilmesi mümkündür.

Controller\IsController.cs
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class IsController : Controller
    {
        public DateTime Index()
        {
             return DateTime.Now;
        }
    }
}

Index() metodunda action olarak DateTime nesnesini geri dönüş değeri almaktadır. İnternet tarayıcısında DateTime ‘ın geri dönüş değeri metin olarak View sayfada gösterilmektedir.

Controller Oluşturuyoruz…

Asp.Net MVC Framework ‘te Controllerları nerelerden nasıl ekleyebileceğimize ve detaylarını inceleyerek yazımıza devam ediyoruz. Bu işlemlerimizi Visual Studio geliştirme ortamı üzerinde örneklerimizi yapıyor olacağız.

Menü üzerinde Projeye Menü Eklenmesi

MVC Framework web projesi şablonu ile oluşturulmuş proje üzerinde yeni bir controller sınıfı eklemek için Controllers klasörünün üzerinde fare ile sağ tıklama ile Add->New -> Controller yolunu izleyerek ekleyebilmemiz mümkündür.



Sonrasında karşımıza controllerin adını gireceğimiz bir ekran çıkmaktadır.



Controller\PersonelController.cs
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class PersonelController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
    }
}

Action Metotunun İskeleti

Biraz önce anlattığımız gibi kolay bir şekilde controller sınıfı ekleyebilmemiz mümkündür. Anlattığımız temel işlemlerin dışında bir de Create, Update ve Details Action metotlarını da basitçe ekleyebilmemiz mümkündür. Sadece yapmamız gereken Controller adını verdiğimiz ekranda senaryolarında oluşmasını isteyip istemediğimizi soran bölüme onay vermek olacaktır.



Seçeneği onaylayığ UrunController sınıfını ekle dediğimizde aşağıdaki sınıfı bize Visual Studio otomatik olarak oluşturmaktadır.

Controller\UrunController.cs
using System.Web.Mvc;
using System.Web.Mvc.Ajax;

namespace MvcApplication1.Controllers
{
    public class UrunController : Controller
    {
        //
        // GET: /Urun/

        public ActionResult Index()
        {
            return View();
         }

         //
         // GET: /Urun/Details/5

         public ActionResult Details(int id)
         {
             return View();
         }

         //
         // GET: /Urun/Create

         public ActionResult Create()
         {
             return View();
         }

         //
         // POST: /Urun/Create

         [AcceptVerbs(HttpVerbs.Post)]
         public ActionResult Create(FormCollection collection)
         {
             try
             {
                   // TODO: Add insert logic here

                  return RedirectToAction("Index");
              }
              catch
              {
                  return View();
              }
          }

          //
          // GET: /Urun/Edit/5

          public ActionResult Edit(int id)
          {
               return View();
           }

           //
           // POST: /Urun/Edit/5

          [AcceptVerbs(HttpVerbs.Post)]
          public ActionResult Edit(int id, FormCollection collection)
          {
              try
              {
                   // TODO: Add update logic here

                   return RedirectToAction("Index");
              }
              catch
              {
                     return View();
               }
          }
     }
}

Oluşturulan sınıf yardımıyla Index, Details, Update, Edit gibi temel veri tabanı işlemleri daha hızlı hazırlayabilmemize olanak tanır.

Controller Sınıfı Oluşturmak

Şu ana kadar sürekli olarak ya daha önceden oluşturulmuş olan controller sınıflarını inceledik ya da Visual Studio yardımıyla kolayca oluşturduk. Şimdi ise boş bir sınıf oluşturarak kendimiz bir controller sınıfı nasıl oluşturabileceğimizi incelemeye çalışalım.

Visual Studio ‘da controllers sınıfına sınıfımızı el ile ekliyoruz. Şimdi yapacağımız adımlara bir göz atalım.

1. Controllers klasörüne bir sınıf ekliyoruz.
2. Eklemiz olduğumuz sınıfın adı muhakkak Controller ile bitmelidir.
3. Sınıfı düzenlerken System.Web.Mvc.Controller ile miraslaşması gerekmektedir.

Bu işlemleri tamamladığımızda kendimiz sorunsuzca bir controller sınıfı oluşturmuş oluruz.



Controller\YaziController.cs
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class YaziController : Controller
    {
        public string Index()
        {
            return "Merhaba Dunya!!!";
        }
    }
}

Index() metodunu internet tarayıcısı üzerinde çağırmak istediğimizde http://localhost:40700/yazi adresini belirtmeniz yeterli olacaktır. Bize Merhaba Dünya!!! Sonucunu döndürecektir.

Not: localhost:40700 ‘deki 40700 port numarasıdır. Bu numara her yeni bir Asp.Net Development Server oluşturulduğunda birbirinden farklı bir biçimde oluşturulabilir. Eğer değişmesini istemiyorsanız projenin özelliklerinden statik olmasını sağlar ya da web sayfanızı localhost altına alıp hiç port numarasına gerek kalmadan kullanabilirsiniz.

Action Oluşturuyoruz…

Yazımız boyunca controller sınıflarının ne işe yaradığını detaylı bir şekilde öğrendik. Şimdi ise yeni bir controller action nasıl oluşturulur, özellikleri nelerdir incelmeye çalışıyor olacağız.

Controller sınıfları içerisinden gelen istekler doğrultusunda işlemler action metotları ile gerçekleştirilir. Şimdi action metotlarının nasıl oluşturulabildiğini incelemeye çalışalım.

Controller Action Ekliyoruz…

HomeController sınıfının içerisine Index() action metodunun dışında birde MerhabaDe() action metodunu oluşturuyoruz. Şimdi bu değişikliği hemen yapalım. J

Controller\HomeController.cs
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        public string MerhabaDe()
        {
            return "Merhaba";
        }
    }
}

Action metot oluştururken dikkat etmemiz gereken kriterler aşağıdaki gibidir.

• Bu metot public(genel) olmalıdır .
• Metot statik olamaz.
• Metodun bir uzantısı olamaz.
• Metoda ilişkin bir yapıcı, alıcı ya da verici olamaz
• Metotta açık genel türleri olamaz.
• Bu metot controller temel alınarak hazırlanmış bir metot değildir.
• Metot parametreleri Ref veya out içeremez.

Controller action metotları geri dönüş değerleri olarak string, DateTime gibi tipleri alabilirler. Asp.Net MVC Framework string olmayan bir action metot parametresini tarayıcı tarafında string değer gönderildiği durumlarda dönüştürme işlemini yapamaz ve hata mesajı verir.

Action metotlarda kullanılacak parametrelerde boş değer de gelme olasılığını düşünerek tipler nullable olarak belirlenir.

Genel bir action metodu oluşturalım. Fakat bu oluşturma işleminde bu metoda action değilsin diyerek bir de çelişkiye sebep olduralım. Bu durumda controller ı ve action adının çağırdığımız durumda bize nasıl bir tepki vereceğine hep bir birlikte bir göz atalım.

Controller\SirketController.cs
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [NoAction]
    public class SirketController : Controller
    {
        public string SirketSirri()
        {
            return "Bu bilgi şirket sırrıdır.";
        }
    }
}

İnternet tarayıcımızda Sirket/SirketSirri yazarak action metodumuzu çağırdığımızda nasıl bir tepki ile karşılaşacağımıza göz atalım.

Gördüğünüz üzere Sirket controlleri ve SirketSirri() metodu olduğu halde bize isteğiniz bulunamamaktadır gibi hata mesajı vermektedir. Bunun sebebi Action metodumuzun başına sen action değilsin dememizden kaynaklanmaktadır.

Bir yazımızın daha sonuna geldik. Bu yazımızı da Controller sınıflarını ve action metotlarını detaylı bir biçimde incelemeye çalıştık.

Herkese mutlu günler diliyorum.