Asp.net MVC EditorTemplates Kavramı

26 Tem

ASP.NET MVC projelerinde HTML kontrollerine etki edebilmenin bir yöntemi de EditorTemplate oluşturmaktır. Model tarafında tanımlanan bir tipe ait bir property için özel şablon(template) hazırlamak mümkündür. Örneğin bool tipindeki bir değişkene karşılık radio button grubu, checkbox veya combobox oluşturmamızı sağlamaktadır.

Bunu bir örnekle açıklamak daha isabetli olacaktır.

Views/Shared dizini içerisine EditorTemplates adında bir dizin oluşturarak işe başlayabiliriz.

EditorTemplates içerisine de YesNo.cshtml adında bir partial view oluşturauyoruz. Bu partial view ile basit bir şekilde bir bool türüne ait combobox temsil etmeye çalışacağız. Örneğin bir kayıt sırasında kişiden alınan profil tipinin genel veya özel olduğu bilgisini temsil edebiliriz.

Eğer genel seçilirse true, özel seçilirse false dikkate alınacak.

Bu template nasıl kullanılacak?

Template kullanımı için bir model içerisindeki bool tipini UIHint attribute ile imzalamamız gerekecek. UIHint attribute parametresi olarakta template adını giriyoruz.

public class Register
{
     [UIHint("YesNo")]
     [Display(Name="Profil Türü")]
     public bool Accept { get; set; }
}

Bu sayede Register modelini kullanan view sayfalarında @Html.EditorFor(m=>m.Accept) şeklindeki ifadelerin yerine direk SelectList gelecek.

Sonuç:

c# indexer işlemleri

25 Tem

Indexer kavramı C# dilinde tipleri diziler gibi kullanılabilir hale getirmektedir. Tiplere ait nesneler tıpkı bir diziymiş gibi indexlere sahiptirler. Bunu örneklerle incelemeye çalışalım.

Tek boyutlu indexer


class Week
{

   string[] week = new string[]{"Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi","Pazar"};

   public string this[int i]
   {
       get { return i >= 0 && i < 7 ? this.week[i] : "Hatalı İndex"; }
   }

}

Haftanın günlerini temsil eden Week sınıfımızı oluşturduk. Week sınıfından oluşturulan nesneler üzerinden sınıf içindeki dizi elemanlarına Indexer sayesinde erişebilecek duruma geldik.


static void Main(string[] args)
{
    Week days = new Week();

    for (int i = -1; i < 8; i++)
    {
        Console.WriteLine(days[i]);
    }
}

Sonuç:

İki Boyutlu Indexer


class Coordinates
{
     int[,] coordinates = new int[,] { { 10, 12 }, { 58, 46 }, { 16, 76 } };

     public int this[int i, int j]
     {
         get { return coordinates[i, j]; }
     }
}

static void Main(string[] args)
{
     Coordinates coor = new Coordinates();

     for (int i = 0; i < 3; i++)
     {
         for (int j = 0; j < 2; j++)
         {
             Console.WriteLine(coor[i,j]);

         }
     }

}

Sonuç:

Asp.net MVC Custom Image Helper

24 Tem

Asp.net mvc uygulamalarında view tarafında kullanılmak üzere kendi özel extension metodlarımızı oluşturabiliriz. Oluşturduğumuz extension metodları da mevcut Html helper tipine bağlayarak rahatlıkla kullanabiliriz.

Html helper tipinde mevcut extension metodlar Action, ActionLink, Label,… şeklinde devam etmektedir. Asp.net mvc takımı, genel ihtiyaçları karşılamak için bu metodları oluşturmuştur. Tüm ihtiyaçlara karşılık verecek metodları da oluşturup sisteme dahil etmeleri de anlamsız ve büyük bir yüktür zaten. İhtiyacımız olan tipleri kendimiz geliştirebilmemiz için bize açık kapı bırakılmıştır.

Bizde bu kapıdan girerek kendi image extension metodumuzu Html helper tipine dahil edelim.

Extension metodlar, statik bir sınıf içerisine statik metodlar halinde tanımlanırlar. Biz de bu şartlara göre Image metodumuzu oluşturabiliriz.


public static class ImageHelper
{
      public static MvcHtmlString Image(this HtmlHelper helper, string imageUrl, string altTag)
      {
            TagBuilder tag = new TagBuilder("img");
            tag.MergeAttribute("src", imageUrl);
            tag.MergeAttribute("alt", altTag);

            return MvcHtmlString.Create(tag.ToString());
      }
}

Artık bu sınıfı view tarafına gösterdiğimizde, @Html.Image(“”,””) şeklinde kullanabiliriz. O halde ImageHelper sınıfını view tarafına nasıl göstereceğimizi inceleyelim.

1.Yol

View sayfasının içerisinde using keywordu ile sınıfın bulunduğu dizini göstermek. View sayfasının  en üstüne @using MyProject.Helpers kodunu yapıştırarak extension metodu kullanmaya başlayabiliriz.

2.Yol

Solution penceresinde ASP.NET MVC projemizin Views dizinindeki web.config dosyası içerisindeki <system.web.webPages.razor>  içerisindeki <namespaces> düğümüne ekleyebiliriz.


<namespaces>
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    <add namespace="System.Web.Routing" />
    <add namespace="MyProject.Helpers" />
</namespaces>

Bu yöntemi uyguladığımızda ilk etapta kodun kullanımı sırasında, extension metodumuzun altını kırmızı olarak çizebilir. Ancak kod çalışır. Eğer visual studio restart edilirse artık extension metodun altı çizilmeyecektir. Bu sorun intellisense tarafına kodumuzun web.config tarafından dahil olamadığındn kaynaklanıyor.

Kodun kullanımı:

@Html.Image(“../Content/Images/flower.jpg”,”flower”)

Sonuç:

Bing Maps SOAP Service, Search Service

23 Tem

Bing Maps SOAP servisleriyle .Net uygulaması geliştirmek başlıklı yazımızın devamı niteliğinde olan bu yazıda da bir başka SOAP servisi olan Search Servisini  incelemeye çalışacağız.

Servisin, uygulamaya nasıl dahil edileceğini bir önceki  Geoscodes service yazısında incelemiştik. Aynı süreci işleterek uygulamaya servisi eklemek mümkündür. Bu yazıda da servisin amacından bahsetmeye çalıştım.

Search service kullanarak bir yerde bulmak istediğimiz şeyleri arayabiliriz. Örneğin bir şehirdeki hastane, postane, sushi, hamburger gibi aramaları yapmak mümkündür.

Kodda düzenleme (refactoring) yapılmamış olması, kodun okunabilirliğini biraz zora sokmuş olabilir. Aceleden dolayı kod bu şeklide kaldı.

Arama işlemlerini bir class üzerinden yürütmeye çalışalım. Arama sorgusu, Keyword ve Location şeklinde parametrelere göre oluşturulmaktadır.

Arama kriterini keyword ve location kelimelerini, noktalı virgülle ayırarak yapabiliriz.

Örneğin: “hospital;london” şeklinde hastaneleri aramak.


public class Search
{

    public string SearchKeywordLocation(string keywordLocation)
    {

       String results = "";
       String key = AppConfig.BingKey;

       SearchRequest searchRequest = new SearchRequest();
       searchRequest.Credentials = new Credentials();
       searchRequest.Credentials.ApplicationId = key;

       StructuredSearchQuery ssQuery = new StructuredSearchQuery();

       string[] parts = keywordLocation.Split(';');
       ssQuery.Keyword = parts[0];
       ssQuery.Location = parts[1];
       searchRequest.StructuredQuery = ssQuery;

       searchRequest.SearchOptions = new SearchOptions();

       searchRequest.SearchOptions.Filters =

       new FilterExpression()
       {
          PropertyId = 3,
          CompareOperator = CompareOperator.GreaterThanOrEquals,
          FilterValue = 8.16
       };

       SearchServiceClient searchService = new SearchServiceClient();
       SearchResponse searchResponse = searchService.Search(searchRequest);

       if (searchResponse.ResultSets[0].Results.Length > 0)
       {
           StringBuilder resultList = new StringBuilder("");

           for (int i = 0; i < searchResponse.ResultSets[0].Results.Length; i++)
           {
              resultList.Append(String.Format("{0}. {1}\n", i + 1,
              searchResponse.ResultSets[0].Results[i].Name));
           }

          results = resultList.ToString();

      }
      else
          results = "No results found";

      return results;

   }

}

Arama kriterini böldüğümüz yer şurası:


StructuredSearchQuery ssQuery = new StructuredSearchQuery();
string[] parts = keywordLocation.Split(';');
ssQuery.Keyword = parts[0];
ssQuery.Location = parts[1];
searchRequest.StructuredQuery = ssQuery;

Servisi çalıştırdığımızda is sonucu şu şekilde alabiliriz.

Londra’daki hastaneleri bu şeklide listeleyebiliyoruz.

Bing Maps SOAP Service, Geocode Service

22 Tem

Bir önceki yazımızda Bing Maps SOAP servislerini incelemeye başlamıştık. Bu yazımızda da yer bulucu servis olan Geococe servisini inceleyeceğiz.

Bu servis sayesinde verilen bir yerin coğrafi konumunu elde etmek mümkündür. Coğrafi konumu elimizde olan bir yerin de adres bilgisini elde etek mümkündür. Servisin sağladığı iki metod bu işlemleri yerine getirir.

Şimdi bir adrese ait coğrafi konum bilgisini bir örnek yardımıyla elde etmeye çalışalım.

Öncelikle elimizde bir Bing Maps Developmet Account Key olması gerekir. Bu key https://www.bingmapsportal.com ‘dan elde edilebilir. Bu key kodlama sırasında bize gerekecektir.

Servisin kullanılabilmesi için projemize eklenmesi gerekmektedir. Bu işlem için projemize sağ tıklayıp Add Service Reference diyoruz. Karşımıza çıkan pencereye aşağıdaki servis linkini yapıştırıyoruz.

http://dev.virtualearth.net/webservices/v1/geocodeservice/geocodeservice.svc?wsdl

Servisimiz Yukarıda bahsettiğimiz gibi iki adet metod içermektedir.

Bu örnekte Geocode metodunu kullanacağız.


public Location CalculateGeocodeOf(string address)
{
       GeocodeRequest geocodeRequest = new GeocodeRequest();
       geocodeRequest.Credentials = getCredentials();
       geocodeRequest.Query = address;
       geocodeRequest.Options = getGeocodeOptions();

       GeocodeServiceClient geocodeService = new GeocodeServiceClient();
       GeocodeResponse geocodeResponse = geocodeService.Geocode(geocodeRequest);

       if (geocodeResponse.Results.Length > 0)
       {
           var location = new Location();
           location.Latitude =  geocodeResponse.Results[0].Locations[0].Latitude;
           location.Longitude = geocodeResponse.Results[0].Locations[0].Longitude;

           return location;
       }

       return null;
}

private GeocodeOptions getGeocodeOptions()
{
    GeocodeOptions geocodeOptions = new GeocodeOptions();
    geocodeOptions.Filters = getConfidenceFilter();

    return geocodeOptions;
}

private ConfidenceFilter[] getConfidenceFilter()
{
    ConfidenceFilter[] filters = new ConfidenceFilter[1];
    filters[0] = new ConfidenceFilter();
    filters[0].MinimumConfidence = Confidence.High;

    return filters;
}

private Credentials getCredentials()
{
     Credentials credential = new Credentials();
     credential.ApplicationId = AppConfig.BingKey;

     return credential;
}

Hazırladığımız CalculateGeocodeOf metodu yardımıyla bir adresin coğrafi konumunu elde edebiliriz.

Bunu bing map üzerinden de doğrulayabiliriz.

Bing Maps SOAP Servisleriyle .Net Uygulaması Geliştirmek

20 Tem

Bing Maps, AJAX destekli uygulamaların sağlamanın yanında bir de desktop uygulamalarda kullanılmak üzere geliştirdiği SOAP servislerini de hizmete sunmaktadır. SOAP servisleri birer WCF (Windows Presentation Foundation) uygulamasıdır. Bu yönüyle WCF servislerini kullanmış olanlara büyük olanak sağlamaktadır.

Bing Maps SOAP servisleriyle, Visual Studio üzerinde uygulama geliştirmek için öncelikle Bing Map Platform Developer Account oluşturmak gerekmektedir. Bing Maps Account Center üzerinden hesap oluşturmak mümkündür. Oluşturulan hesap üzerinden development amacıyla bir application key üreterek uygulamalarda kullanabilirsiniz.

Bing Maps SOAP Servisleri

GeocodeService : http://dev.virtualearth.net/webservices/v1/geocodeservice/geocodeservice.svc?wsdl

SearchService    : http://dev.virtualearth.net/webservices/v1/searchservice/searchservice.svc?wsdl

ImageryService : http://dev.virtualearth.net/webservices/v1/imageryservice/imageryservice.svc?wsdl

RouteService      : http://dev.virtualearth.net/webservices/v1/routeservice/routeservice.svc?wsdl

Geocode Service

Bu servis, coğrafi konumları adreslere dönüştürmek veya adresleri coğrafi konumlara dönüştürmek için kullanılır.

Örneğin: İzmit, Kocaeli adresinin Latitude ve Longitude değerlerini verir. Ya da Latitude ve Longitude değerleri verilen bir coğrafi konumun adres bilgisini üsküdar, istanbul şeklinde verir.

Search Service

Bu servis, “ne/nerede” şeklindeki aramaların sonucunu döndüren tek bir metod sunar. Örneğin Colarado’da pizza yemek istiyorsunuz. “pizza;co” şeklinde bir arama yaptığımızda bize Colarado’da pizza yapan restoranların listesini döndürecektir.

Imagery Service

Bu servis, iki metod barındırmaktadır. İlk metod harita görüntülerinin alınmasını sağlar. Diğer metod ise ilgili resmin metadata bilgisinin alınmasını sağlar.

Route Service

Bu servis, iki nokta arasındaki rotanın hesaplanmasını sağlar. Bu hesaplamayı başlangıç noktasından varış noktasına doğru ana yönleri noktasal şeklide belirleyerek yapar.

Örneğin; A noktası, 1km sonra Sola dön, 2km sonra sağa dön şeklinde.

Bu servisleri, fırsat buldukça uygulamalarla incelemeye devam edeceğiz.

Sunucunun gelen requestlere tepkisi

19 Tem

Web sunucunuza peş peşe gelen gelen requestler karşısında işlemci (CPU) ve belleğinizin (RAM) tepkisi nasıl olur diye düşündünüz mü?

Ben bunu gerçekten merak ediyordum. Sonucu görmek için test sunucumu, C# ile yazdığım bir bot yardımıyla request yağmuruna tuttum.

Acaba RAM mi daha fazla yorulur CPU mu sorusunun cevabını bulmak üzereydim. Tabi sonuç tüm sunucular için aynı olmayabilir. Çünkü istek gönderilen sayfaların veritabanını kullandığı, diskler arama yaptığı, bellek gerektirecek işlemler yaptığı göz önünde bulundurulmalıdır.

Benim aldığım sonuç şu şekildeydi.

Bellekte neredeyse hiç bir tepki olmazken CPU %80 – %90 gibi seviyelere ulaştı.

Asp.net Globalization Ayarları

18 Tem

Asp.net projelerimizi yayınladığımızda bazen türkçe karakter sorunlarıyla karşılaşabilmekteyiz. Bu yazıda anlatmak istediğim Türkçe karakter sorununda ziyade geliştirme yaptığımız bilgisayarlar ile sunucular arasındaki kültür farkından kaynaklanabilecek sorunlar hakkında olacak.

Örneğin kendi makinamız türkçe işletim sistemli ve sunucumuz da yurt dışında. Bu durumda hem türkçe karakter sorunu, hem de tarihsel farklardan dolayı oluşabilecek tarih format farklılıkları gibi sorunlarla karşılaşabilmekteyiz. Bu durumu aşmak için yapmamız gereken web.config dosyası içerisindeki system.web alanına bir globalization ayarını düzenlemektir.


<system.web>
<globalization culture="tr-TR" />

Bu durumda kültük farkından kaynaklanan sorunlardan kurtulabilmekteyiz.

Eğer ASP.NET MVC projesi ile geliştirme yapıyorsak, Default model binder, kültür farkından dolayı tarih formatlarındaki property’leri set edemiyor. Böyle bir sorunu da bu şekilde aşabilmekteyiz.

LINQ ile String Birleştirme

17 Tem

Bazen üyelerin emaillerini çekerek toplu mail göndermek durumunda kalabiliriz. Email listesini çekmek kolaydır. Fakat bir de bu emaillerin, aralarına noktalı virgül koyarak birleştirmesi işlemi vardır. Bu işlemi iki yolla yapabiliriz.

  • Email listesini SQL ortamında noktalı virgülle ayrılmış şekilde çekmek.
  • Email listesini dizi şeklinde SQL sorguyla alıp, birleştirme işlemini kod tarafında yapmak.

Biz ikinci yöntem üzerinde duracağız.

Elimizdeki email listesi şu şekilde olsun.


List<string> data = new List<string>
{
    "aaa@mail.com",
    "bbb@mail.com",
    "ccc@mail.com",
    "ddd@mail.com",
    "eee@mail.com"
};

Bu listeyi şimdi birkaç yöntemle birleştirmeyi deneyelim.

Birinci yol: LINQ Aggregate extension metodunun kullanımı.

var emails = data.Aggregate((s, e) => string.Concat(s, ";", e));

İkinci yol: String.Join extension metodunun kullanımı.

var emails = string.Join(";", data);

Her iki yönteminde çıktısı şu şeklide olacaktır:

"aaa@mail.com;bbb@mail.com;ccc@mail.com;ddd@mail.com;eee@mail.com"

LINQ / Lambda Expression

16 Tem

Bu yazımızda da LINQ sorgularının lambda ifadeleriyla nasıl yazıldığını inceleyelim. Uzun uzun yazılan LINQ sorgularını tek satırda yazmak mümkündür. Bu sayede hem temiz hemde rahat okunabilir bir kod ortayaçıkıyor.

Bir Employee sınıfı oluşturup, sorgulama yapmak için de bu tipe ait bir liste oluşturarak işe başlayabiliriz.


 public class Employee
 {
       public int id { get; set; }
       public string Name { get; set; }
       public double Salary { get; set; }

       public override string ToString()
       {
            return string.Format("Name: {0} Salary: {1}",Name, Salary);
       }
 }

Employee tipine ait liste de şu şekilde olsun.


 List<Employee> Employees = new List<Employee>
 {
      new Employee{ id=1102, Salary=1250, Name="Jim" },
      new Employee{ id=1802, Salary=2250, Name="Tim" },
      new Employee{ id=1650, Salary=3250, Name="Kim" },
      new Employee{ id=2102, Salary=1750, Name="Sim" },
      new Employee{ id=3182, Salary=1350, Name="Him" },
};

Sorgu: Maaşı 1900’den küçük olan çalışanları ada göre sıralayarak göster.

Linq Sorgusu

    var linqResult = from c in Employees
                     where c.Salary < 1900
                     orderby c.Name
                     select c;

Lambda Expression Sorgusu

var lambdaResult = Employees.Where(i => i.Salary < 1900).OrderBy(i => i.Name);

Sorguları çeşitlendirmek mümkündür. Sonuçta bu örnek göldeki bir damla gibidir.