MVC Framework Önerileri 1 - AbstractController

MVC Framework iyiden iyiye büyük projelerde kullanılmaya başlandı. Hoş ben çıktığından beri istisnasız kullanıyorum =) Web Form ne demekti unuttum sayılır :P Ancak MVC bize hazır bir pattern getirse bile yine de bazı eksiklikleri ve bizim dikkat etmemiz gereken noktaları var. Bahsedeceğim nokta Controller yapımızla ilgili.

Sorunu anlamak için başımdan geçen örnek bir senaryo vereyim: 
Geliştirdiğimiz bir sitenin aynı fiziksel site üzerinden birden çok müşteriye hizmet vermesi isteniyor. Müşterilerin bir listesi konfigürasyon xml’i olarak saklanacak ve gerekli bilgiler buradan alınacak. Ancak gelen isteğin hangi müşteriye ait olduğunu subdomain kullanarak anlamamız gerekiyor.

Bu problemin çözümü tek controller kullandığımız zaman oldukça kolay. Ancak birden çok controller bulunması halinde, tüm controllerlar ve bu controllerlar içerisindeki tüm actionlar için aynı işlemin yapılması gerekecek. DRY (Don’t Repeat Yourself) Principle bize ne demekte: Eğer uygulamanızda tekrarlayan kodlar varsa tasarımı gözden geçiriniz. Şimdi bu sorun (ve tabi ki benzer mantığa sahip diğer tüm sorunlar) için kullanılan çözümü inceleyelim: Abstract Controller.

Yukarıdaki class diagramın göstermekte olduğu gibi elimde iki adet controller var, Home ve Help. Bu controllerlar ortak olarak AbstractController sınıfından türemekteler. Peki controller olma özelliklerini kaybettiler mi? Hayır çünkü temel AbstractController sınıfı Controller’dan türemekte.

AbstractController.cs


public abstract class AbstractController : Controller
{
     public string CustomerName { get; set; }
 
     protected override void OnActionExecuting(ActionExecutingContext filterContext)
     {
         base.OnActionExecuting(filterContext);
 
         //url'den ayırma işlemi yapıldığını varsayıyoruz
         CustomerName = "Yüce Çelikel";
         ViewData["CustomerName"] = CustomerName;
     }
}

Görüldüğü gibi AbstractController içerisinde CustomerName isminde bir özellik tanımladık. Bunun yanında OnActionExecuting metodunda ViewData içerisine bu CustomerName’i yerleştirdik. OnActionExecuting metodu bir action çalıştırılmadan önce yapılacak işlemleri belirlememizi sağlar. Bu metot AbstractController içerisinde tanımlandığı için artık bu sınıftan türeyen tüm Controllerlar çalıştırılmadan önce ViewData içerisine müşteri bilgisi eklenecek. Eğer bilgi çıkarma algoritmasında bir değişiklik olursa tek tek tüm controllerları ellemek zorunda kalmayacağız ;)

Ben AbstractController üzerine bir de AbstractDbController koyarak database erişimi olacak olan controllerı da ayırmayı tercih ediyorum. Her controller illa ki bir data kaynağı nesnesi oluşturmak zorunda değil ne de olsa ;)

Şimdilik bu kadar arkadaşlar. Zaman buldukça aklıma gelen önerileri ve bilgileri yine paylaşacağım buradan. Esen kalın..

Anahtar Kelimeler MVC, AbstractController
Dosyalar

Custom ActionResult Hazırlama (ImageResult)

ASP.NET MVC teknolojisinin en güzel yanlarından biri de neredeyse her Microsoft teknolojisi gibi genişletilebilir olması. Şimdi genişletme işlemi için belki de en çok kullanacağınız işlem olan kendimize özel ActionResult hazırlama yöntemini göreceğiz.

ActionResult sınıfı bir action metodunun kompleks işlemler yapan bir sonuç gerektirmesi durumunda kullanılır. Bu sınıf bir abstract class olduğu için nesne alınamaz. Zaten içerisinde de tek metot bulunmaktadır : ExecuteResult. Bu metot ActionResult ile yapılan işlemlerin çalıştırılması için kullanılır. Bizim kullandığımız ViewResult, FileResult, RedirectResult, JsonResult gibi tüm resultlar ActionResult sınıfından türerler. Bu durumda biz de kendi resultlarımızı oluşturabiliriz. Tek yapmamız gereken ActionResult sınıfından türeyen ve ExecuteResult metodunu override eden bir sınıf hazırlamak.

Örnek :

Custom Result Solution

Örneğimde site üzerinde belirli bir klasörde bulunan (Content/Images)  bir resmin görüntülenmek üzere img etiketine sağlayacak olan bir ImageResult hazırlayacağım. Bu result sınıfını da AlbumController isimli controllerda GetSingleImage isimli bir action içerisinde kullanacağım. Action metodumuz istediği resmin sadece ismini parametre olarak alacaktır. Bu örneğe uyacak şekilde hazırladığım AlbumController ve ImageResult kodları aşağıda verilmiştir.

using System;
using System.Web;
using System.Web.Mvc;
using System.Drawing;
using System.Drawing.Imaging;

namespace CustomActionResult.Controllers
{
    public class AlbumController : Controller
    {
        public ImageResult GetSingleImage(string isim)
        { 
            string url = String.Format("~/Content/Images/{0}", isim);
            return new ImageResult() { ImageUrl = url, Format = ImageFormat.Png };
        }
    }

    public class ImageResult : ActionResult
    {
        public string ImageUrl { get; set; }
        public ImageFormat Format { get; set; }
        
        public override void ExecuteResult(ControllerContext context)
        {
            Image sonuc = GetImage(context);
            HttpResponseBase response = context.HttpContext.Response;

            //response içeriğini ayarlama. resim türü Format özelliğinden alınmaktadır
            response.ContentType = String.Format("image/", Format);

            //resmi client'a gönderilecek bilgileri oluşturan Response'a yazma
            sonuc.Save(response.OutputStream, Format);
        }

        protected Image GetImage(ControllerContext context)
        {
            if (!String.IsNullOrEmpty(ImageUrl)) //resim adresi verilmişse adresten resmi yükle
            {
                string url = context.HttpContext.Server.MapPath(ImageUrl);
                return Image.FromFile(url);
            }
            else //her iki parametre de geçersizde hata fırlat
            {
                throw new ArgumentException("Resim adresi veya resim verilmemiş");
            }
        }
    }
}

Resmi Response üzerine yazma şeklimiz klasik ASP.NET’ten alışık olduğumuz bir kullanım. Görüldüğü gibi MVC, ASP.NET mimarisinin üzerine son derece uyumlu olacak bir şekilde tasarlanmıştır.

Bu controllerı kullandığım sayfa kodları ise aşağıdaki gibidir. Görüleceği üzere tek yaptığım img etiketine kaynak olarak Url.Action metodunu kullanarak legendary.jpg isimli dosyayı vermektir.

<%@ Page Language="C#"  Inherits="System.Web.Mvc.ViewPage" %>

<html>
    <head>
        <title>Custom Action Result</title>
    </head>
    <body>
        <h2>Album Resim</h2>    
        <img src="<%= Url.Action("GetSingleImage", "Album", new { isim = "legendary.jpg" }) %>" />
    </body>
</html>

Çıktı olarak ise aşağıdaki görüntüyü elde ederiz. Görüntüde legendary isimli resmin gözükmesi hazırladığımız ImageResult sınıfının başarılı olduğunu göstermektedir.

Anahtar Kelimeler ASP.NET MVC ActionResult ExecuteResult ImageResult
Dosyalar Custom ActionResult.rar

Fenerbahçe - Steau Bükreş Maçındaydım

Dün akşam 3-1 kazandığımız Fenerbahçe - Steau Bükreş maçındaydım. 4 arkadaş beraber izleyince tabi tadına doyum olmadı. Temponun çok düştüğü dakikalarda sıkılmış olsak da özellikle ikinci yarının ilk 20 dakikasında son derece eğlenceli ve hırslı bir maç oldu. Santos'un ve kaptan Alex'in golleri öyle ustacaydı ki mest olduk. Bir de Alex'in ayağı takılmasa güzel de bir 4. gol gelecekti. Sağlık olsun. Tüm takıma bize bu geceyi yaşattıkları için candan teşekkürlerimi sunuyorum.

Kadıköy StarbucksMaç sonrası

Anahtar Kelimeler Fenerbahçe Steau Bükreş
Dosyalar

IIS Olmadan WCF Host Etme

WCF servislerini IIS olmadan host etmenin bir yoluna ihtiyacınız hiç oldu mu? Eğer olduysa bunu başarmanın kolay bir yolu var: ServiceHost sınıfı. ServiceHost herhangi bir uygulama içerisinde (konsol, winforms vs.) bir servisi başlatıp bitirmemizi ve yaşam süreci boyunca kullanmamızı sağlar. Bu sınıfı test etmek amacıyla biri servisi host edecek öteki de kullanacak olan iki konsol uygulaması kullanacağız.

Not: Her iki uygulamada da WCF sınıflarını kullanabilmek için System.ServiceModel kütüphanesini referans eklemek gerektiğini unutmayınız.

Wcf_Host isimli uygulama adından da anlaşılacağı gibi servisimizi host eden uygulamadır. Uygulamada servisin imzasını belirten IMatServis ServiceContract’ı ve servisi tanımlayan MatematikServis sınıfları vardır. Servisin endpoint bilgileri ise App.config dosyası içerisine yazılmıştır.

IMatServis.cs :

using System;
using System.ServiceModel;

namespace Wcf_Host
{
    [ServiceContract]
    interface IMatServis
    {
        [OperationContract]
        double Topla(params double[] sayilar);
    }
}

MatematikServis.cs :

using System;
using System.Linq;

namespace Wcf_Host
{
    class MatematikServis : IMatServis
    {
        public double Topla(params double[] sayilar)
        {
            return sayilar.Sum();
        }
    }
}

App.config :

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="Wcf_Host.MatematikServis">
        <endpoint address="http://localhost:1020/MatematikServis" 
                  binding="basicHttpBinding" contract="Wcf_Host.IMatServis" />
      </service>
    </services>
  </system.serviceModel>
</configuration>

Şimdi sırada servisin host edilmesi var. Host işlemi için kullanacağımız ServiceHost sınıfı bizden çalıştıracağı servisin türünü parametre olarak bekler. Bu parametreyi verdikten sonra istenirse servisin kullanacağı binding tipi ve endpointler programatik olarak tanımlanabilir. Ancak biz zaten projemizde bu bilgileri App.config dosyası içerisinde verdiğimizden tekrar belirtmemize gerek bulunmamaktadır.

Artık servisi yayına başlatmak için tek yapmamız gereken ServiceHost nesnesinin Open() metodunu kullanarak servisi yayına açmaktır. Open metodu çağırıldıktan sonra uygulama Main metodu içerisinde kendisini çalıştırmaya devam eder ve Close metoduna gelerek kendini hemen kapatır. Servisin bir tuşa basılana kadar açık kalmasını sağlamak için de basitçe bir Console.ReadLine metodu koyarak host uygulamasının beklemesini sağladık.

Program.cs :

using System;
using System.ServiceModel;

namespace Wcf_Host
{
    class Program
    {
        static void Main(string[] args)
        {
            //MatematikServis türünden bir servisi host edeceğini bildirme
            ServiceHost host = new ServiceHost(typeof(MatematikServis));

            host.Open(); //servis yayınını başlatma
            Console.WriteLine("Servis Yayına Açıldı...");

            Console.ReadLine(); //yayının açık kalmasını sağlama
            host.Close(); //yayını kapatma
            Console.WriteLine("Servis Yayını Kapatıldı...");
        }
    }
}

Şimdi servisimizi test etmek için bir client uygulaması hazırlayalım. Bu uygulamada yine Contractımız bulunacak, servis proxyi ise bir MatematikServisClient isminde bir sınıf belirtecektir. Bu sınıfın tanımlaması aşağıdaki gibidir.

MatematikServisClient.cs :

using System;
using System.ServiceModel;

namespace MatematikIslemler
{
    class MatematikServisClient : ClientBase, IMatServis
    {
        public double Topla(params double[] sayilar)
        {
            return Channel.Topla(sayilar);
        }
    }
}

Client uygulamamızdaki bu proxy’nin hangi adrese hangi binding türüyle bağlanacağını ise yine bu uygulamadaki App.Config içerisine aşağıdaki gibi yazıyoruz.

App.config :

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <client>
      <endpoint address="http://localhost:1020/MatematikServis"
                  binding="basicHttpBinding" contract="MatematikIslemler.IMatServis" />
    </client>
  </system.serviceModel>
</configuration>

Son olarak da bu proxyi kullanarak servis çağrımızı yapıyoruz. Unutmayın ki client uygulamasının çalışması için mutlaka host uygulama da açık olmalıdır. Windows Vista ve 7 altında UAC açık olduğunda host uygulamasının düzgün çalışabilmesi için Run as Administrator diyerek uygulumayı yönetici olarak çalıştırmanız gerekmektedir.

Program.cs :

using System;

namespace MatematikIslemler
{
    class Program
    {
        static void Main(string[] args)
        {
            MatematikServisClient cl = new MatematikServisClient();
            double sonuc = cl.Topla(10, 20, -100, 45);
            Console.WriteLine(sonuc);
        }
    }
}

Host uygulaması açıldıktan sonra client çalıştırıldığında elde edeceğimiz ekran çıktıları aşağıdaki gibi olacaktır.

Wcf Host Uygulaması

Wcf Client Uygulaması

Yüce ÇELİKEL
MCPD Enterprise Developer 

Anahtar Kelimeler WCF ServiceHost Binding Contract Endpoint Proxy
Dosyalar

ASP.NET MVC'de JsonResult ve JQuery Yardımıyla AJAX

Bu makalemde sizlere ASP.NET MVC  kullanarak Jquery yardımıyla nasıl AJAX işlemi yapılabileceğinden bahsedeceğim.  İhtiyacımız olacak olan elementler ise jquery script dosyası ve ASP.NET MVC projesi olacaktır.

Bilindiği üzere AJAX denilen kavram javascript kullanılarak tarayıcı arkaplanında server üzerine bir istek yapmak ve istekten dönen sonucu DOM üzerine yansıtmaktır. Tarayıcı üzerinde yazdığımız javascript kodlarını kısaltmak ve işimizi kolaylaştırmak amacıyla JQuery kütüphanesi geliştirilmiştir. Bizim inceleyeceğimiz nokta ise Jquery’e ASP.NET MVC kullanarak nasıl veri sağlanacağıdır. AJAX işlemlerinde veri transferi için XML veya daha ufak boyutlara sahip ve javascript ile entegrasyonu kolay olan JSON kullanılır. Makalemizde transfer amacıyla JSON kullanılacaktır.

ASP.NET MVC mimarisinde controllerlar client’a gönderilecek olan cevap türünü yönetmekle sorumludurlar. Ancak geriye sadece sayfa çıktıları olarak HTML gönderilebildiğini düşünüyorsanız yanılıyorsunuz. Geri dönüş bilgiler bir string, resim, dosya veya örneğimizde kullanacağımız JSON olabilir. Bütün bu türler için MVC Framework içerisinde ActionResult sınıfından türemiş bazı sınıflar bulunmaktadır ve bu türler cevap gönderme işlemleriyle sorumludurlar. Client’a JSON verisi gönderebilmek için hazırlayacağımız action metodunun geri dönüş türü JsonResult olmalıdır. Herhangi bir nesnenin JSON karşılığını hazırlamak için de temel Controller sınıfından gelen Json() metodu kullanılmalıdır.

Örneğimizde bir dizi içerisinde saklanan isim listesinde arama yapacak ve koşulu sağlayan isimleri JSON formatına göre dizi olarak yollayacağız. Bu amaçla aşağıdaki Controller ve içerisinde de Listele action’ı yazılmıştır.

HomeController.cs :

using System;
using System.Web.Mvc;

namespace Mvc_Ajax.Controllers
{
    public class HomeController : Controller
    {
        //isim önerilerinin getirileceği isim dizisi
        string[] isimler = { "Yüce", "Çelikel", "Hakkı", "Nefise", "İrfan", "Sercan" };

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

        public JsonResult Listele(string isim)
        {
            string[] sonuc = null; //sonuçların yazılacağı dizi

            if (!String.IsNullOrEmpty(isim))//eğer gönderilen değer boş değilse
                sonuc = Array.FindAll(isimler, s => s.Contains(isim));//içerisinde yollanan değer 

geçen tüm 

değerleri bul
            else
                sonuc = isimler;//eğer gönderilen değer boşsa tüm seçenekleri yolla
            
            //diziyi json formatına çevirme ve geri döndürme
            return Json(sonuc);
        }
    }


Listele metodu client tarafından gönderilecek isim türünden bir parametreyi alacak şekilde tasarlanmıştır. Eğer gönderilen isim değeri boş veya null ise dizi içerisinde tüm elemanlar geriye yollanır. Ancak boş değilse dizide gönderilen değeri taşıyan elemanlar bulunur ve bunlardan oluşan bir liste client’a yollanır. En son satırda da görüleceği gibi oluşan string[] dizisi Json metoduna parametre olarak verilir ve çıktı JSON türünde kullanıcıya yollanır.

Arayüzümüzde ise bir textbox ve listbox kullanıyoruz. Textbox içerisindeki değer değiştiğinde AJAX işlemi yapılır ve Listele action’ı  çağırılır. Eğer işlem başarılıysa sonuç alınır ve eval() fonksiyonu kullanılarak bir javascript dizisi haline çevrilir. Daha sonra da bu dizinin her bir elemanı için listbox içerisinde bir seçenek (option) eklenir. Dizi elemanlarının her biri için aynı işlemin yapılmasını bir jquery kolaylığı olan each() fonksiyonu ile sağlıyoruz.

Home.aspx :

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %>
<html>
    <head>
        <script type="text/javascript" src="../../Scripts/jquery-1.3.2.js"></script>
        <style type="text/css">
            label
            {
                display:block;    
            }
        </style>
    </head>
    <body>
        <!-- isimleri textbox verisine göre listeleme -->
        <label>İsim :</label> 
        <%= Html.TextBox("Isim") %><br />
        
        <label>Seçenekler :</label>
        <select size="5" id="Secenek" style="width:150px">
        </select>
        
        <script type="text/javascript">
            $(document).ready(function() {
                //Isim textbox'ına klavye tuşuna basıldığında
                $("#Isim").keyup(function() {
                    
                    //ajax işlemi yaparak eşleşen isim listesini al
                    $.ajax({
                        url: "/Home/Listele?isim=" + $(this).val(), //bu adrese id ismindeki parametrenin değeri 

olarak textbox'ın değerini yolla
                        dataType: "json", //geriye json türünde veri dönecek
                        type: "GET", //bu GET türünde bir istek olsun
                        success: function(result) { //işlem başarılı oursa
                            $("#Secenek").html(""); //eski seçenekleri temizle
                            var isimler = eval(result); //json verisini javascript nesneleri haline getir

                            //her bir isim için seçeneklere yeni bir option ekle
                            $.each(isimler, function(count, item) {
                                $("#Secenek").append("<option>" + item + "</option>");
                            })
                        },
                        error: function() { //hata oluşursa ekranda mesaj göster
                            alert("İsim listesi okumada hata oluştu");
                        }
                    })
                });
            });
        </script>
    </body>
</html>

Yukarıdaki kodları çalıştırdığımız zaman aşağıdaki arayüzü ve textbox içerisine yazı yazdığımız zaman da yandaki resimdeki görüntüyü elde ederiz.

JsonResult ile AJAX   JsonResult ile AJAX

Yüce ÇELİKEL
MCPD Enterprise Developer 

Anahtar Kelimeler ASP.NET MVC Framework JSON JsonResult AJAX JQuery
Dosyalar Mvc_Ajax.rar

Sapanca Gezisi

Tayfa Entertainment olarak bir gezimizi daha başarıyla bitirmiş bulunuyoruz. Bu sefer durağımız Sapanca oldu. Tabi gidilecek yer Sapanca olunca trensiz olur mu? Zevkli bir tren yolculuğu oldu tayfayla. Sapanca’da mutlaka yapılması gerek iki şeyi ise şöyle sıralayayım : Göl üzerinde deniz bisikleti kullanma ve güveçte alabalık yeme.

Bu organizasyonumuza katılan tayfa üyeleri Ezgi, Mehmet, Cenker, Seda, Merve ve tabi ki ben çok çok eğlendik. Yorgunuz ama mutluyuz huzurluyuz =) Size de mutlaka Sapanca’ya gitmenizi tavsiye ederim.

Sapanca GarıSapancaya DoğruSapanca'da Mutlu Son

Not: Biricik annemin hazırladığı yolluklar sanırım herkes için bu gezinin en büyük sürprizi ve hediyesi oldu =) Kendisine buradan tekrar teşekkürlerimi sunarım.

Anahtar Kelimeler Sapanca Güveçte Alabalık Tren Tayfa
Dosyalar

Çizim İşlemlerinde Yazı Ortalama

Çizim işlemleri yaparken resim üzerine veya pencereye çizeceğimiz yazıların yatay veya dikey olarak ortalanmasını isteyebiliriz. Ortalama işlemini yapmak için DrawString metoduna verilen ek bir parametre vermek gerekiyor. Bu parametre de StringFormat sınıfı türünden bir nesne olmalı.

StringFormat sınıfı yazıyı otomatik alt satıra kaydırma (wrap) ve ortalama (aligment) işlemleriyle ilgili özellikleri saklayan bir sınıftır. Bizi ilgilendiren özellikle Alignment özelliğidir. Bu özelliğe atanan StringAlignment enumunun değerine göre bir yaslama yapılır. Enum Near, Far ve Center olarak 3 değer taşır. Ortalama yapmak için Center değeri seçilmeli.

   StringFormat strFrmt = new StringFormat();
   strFrmt.Alignment = StringAlignment.Center;

Aşağıdaki uygulamada dinamik olarak hazırladığım bir resmin içerisine yazdığım yazıyı ortaladım ve ortaya çıkan resmi bir PictureBox içerisinde gösterdim. Resmin genişliği yazdığım yazıdan çok daha geniş olduğunda ortalama işleminin etkisini görebileceğiz. Ancak burada unutmamamız gereken nokta böyle bir durumda yazının çizilmeye başlanacağı (x,y) koordinatı yerine çizim alanının RectangleF türünden verilmesi gerekliliğidir. Bizim örneğimizde bu alaN metoda gönderilen resmin boyut değeri (PhysicalDimension) kullanılarak oluşturulmuştur.

Form1 Design :

Yazı Ortalama Design

Form1.cs :

using System.Drawing;
using System.Windows.Forms;

namespace CizimStringOrtalama
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            //hazırlanan resmi picture box'ta gösterme
            pict_orta.Image = OrtalanmisResimHazirla();
        }

        public Image OrtalanmisResimHazirla()
        {
            //400 piksel'e 200 piksel boyutlarında Bitmap oluşturma
            Bitmap img = new Bitmap(400, 100);

            //resmi üzerine yazı yazılması için yollama
            YaziYaz(img);

            return img;
        }

        public void YaziYaz(Image img)
        {
            //çizim işlemini yapacak grafik nesnesini oluşturma
            Graphics grp = Graphics.FromImage(img);

            //yazı fontu bilgileirni oluşturma
            Font fnt = new Font("Verdana", 15);

            //çizim işlemi için mavi renkli fırça hazırlama
            SolidBrush brsh = new SolidBrush(Color.Blue);

            //çizim yapılacak alanı belirleme. Bu alan resmin tüm genişliği ve yüksekliği olacaktır;
            RectangleF alan = new RectangleF(new PointF(0, 0), img.PhysicalDimension);

            //ASIL ORTALAMAYI BU KISIM YAPAR. STRINGFORMAT SINIFI STRING'IN NASIL SIĞDIRILACAĞI BİLGİSİNİ TAŞIR
            StringFormat strFrmt = new StringFormat();
            strFrmt.Alignment = StringAlignment.Center; //yazının yerleşiminin ortalanmasını istiyoruz

            grp.DrawString("Yüce Çelikel", fnt, brsh, alan, strFrmt);
        }
    }
}

Bu uygulamanın çalıştırılması sonucu oluşan ekran görüntüsü ise şöyledir : 

Yazı Ortalama Yatay

Görüldüğü gibi resim tüm sayfayı kaplamakta ancak yazı bu resmin ortasında çıkmaktadır. Aynı işlemi yatay değil de dikey eksende yapabilmek için bu sefer de LineAlignment özelliğine StringAligment enumu türünden bir Center değeri vermemiz yeterli olacaktır.

strFrmt.LineAlignment = StringAlignment.Center; //yazı yerleşimi dikey eksende ortalanır

Bu satırı kodlara eklememiz sonucu ortaya çıkan ekran görüntüsü ise şöyle olur :

Yazı Ortalama Dikey

 

Bir başka makalede görüşmek üzere.
YÜCE ÇELİKEL
MCPD Enterprise Developer

Bir başka makalede görüşmek üzere.

Yüce ÇELİKEL
MCPD Enterprise Developer

 

Anahtar Kelimeler StringFormat Alignment Drawing DrawString
Dosyalar CizimStringOrtalama.rar

C# ile Özel Font Kullanımı

Son yaptığım proje için doğan bir ihtiyacımı sizinle paylaşmak isterim. Bu projede resimler üzerine kullanıcının seçeceği font aileleri ve boyutlarda yazı yazmam gerekiyordu. Farklı olan nokta ise sistemde yüklü olmayan fontların da sadece .ttf uzantılı dosyalar verilerek kullanılabilmesinin istenmesiydi. Bu durumda sorduğum soru ise C# ile font dosyalarını okuyup birer FontFamily nesnesi haline getirmenin mümkün olup olmadığı oldu. Araştırmalarım sonucunda karşıma PrivateFontCollection sınıfı çıktı.

System.Drawing.Text isimalanı içerisinde bulunan bu sınıftan alınan bir nesne, içerisinde birden çok FontFamily nesnesini saklayabilir. Ancak koleksiyonun içerisine fontlar ancak AddFontFile metodu ile eklenebilir.

Aşağıdaki uygulamada bir Winforms projesi kullandım. Proje arayüzü sadece bir labeldan oluşmakta. Özel yüklediğmiz fontu bu labelın font değeri olarak atayarak, işlemin başarılı olup olmadığını anlayacağız. Bu amaçla form sınıfında bir LoadCustomFont metodu hazırladım. Bu metot verilen adresteki font dosyasını yükleyip, ona ait olan FontFamily nesnesini geriye döndürecektir. Font dosyası olarak da proje klasörü içerisine koyduğum Insula.ttf kullanılacaktır.

Form1 Design :

Özel Font Form Tasarım

using System.Drawing;
using System.Drawing.Text;
using System.Windows.Forms;

namespace OzelFont
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            //15 em büyüklüğünde Insula kullanan font nesnesini hazırlayıp, atama
            FontFamily aile = LoadCustomFont(@"..\..\Insula.ttf");
            lbl_sonuc.Font = new Font(aile, 20);
        }

        public FontFamily LoadCustomFont(string url)
        {
            PrivateFontCollection customs = new PrivateFontCollection();
            customs.AddFontFile(url); //font dosyasını verilen adresten yükleme

            return customs.Families[0]; //yüklenen ilk fontfamily nesnesini döndürür
        }
    }
}

Yukarıdaki kodlarla oluşturulan proje çalıştırıldığında aşağıdaki ekran görüntüsünde olduğu gibi label üzerinden yazı fontunun değiştiği ve Insula haline geldiği görülecektir.

Son Ekran Görüntüsü :

Insula Label

 

Yüce ÇELİKEL

MCPD Enterprise Developer

Anahtar Kelimeler PrivateFontCollection Custom Font FontFamily
Dosyalar OzelFont.rar

Site Yenilemesi ve Host Değişikliği

Artık alıştığınız üzere sitemi bir kez daha yeniledim. Hep söylüyorum. Sitem benim aynam. Ben ve bilgilerim görüşlerim değiştikçe o da bu değişikliklere ayak uyduruyor. Şimdiki sitem tüm yapısında ASP.NET MVC kullanıyor. Son derece kolay ve temiz kodlama oldu benim için. Gerçekten de muhteşem bir teknoloji. Öğrendiğim tüm ayrıntıları bir makale dizi olarak paylaşacağım.

Sitemle ilgili bir başka haber de artık sitemin Türkiye'de host ediliyor olması. Servergrid ile javascript dosyalarının içerisine eklenen kodlar sebebiyle ters düştüm. Sitem script injection yememesine rağmen bu sorun beni çileden çıkarttı ve çabuk davranıp işi bitirdim.

Şimdilik bu kadar. Yakın zamanda tüm bildiklerimi sizlerle paylaşmaya başlayacağım. Ben de çok heyecanlıyım Smile

Anahtar Kelimeler ASP.NET MVC Script Injection
Dosyalar