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ç:

C# Linq ileKelime( Word ) Histogram Oluşturma

10 Tem

Konuya direk dalmadan önce histogramın ne olduğunu açıklamadan geçmek istemiyorum. Histogram, bir topluluktaki elemanların sayısal sıklıklarını, yoğunluklarını belirten tablolar diyebiliriz. Gösterim şekli olarak genelde grafiksel bir gösterimi vardır. İsterseniz tablo şeklinde de tutabilirsiniz. Ancak Grafiksel gösterimler daha akılda kalıcıdır.

Histogramı c# tarafında özetleyecek bir kelime analiz uygulamasının uygun olacağını düşündüm. Bu amaçla, bir döküman içerisindeki kelimelerin hangi sıklıklarla kullanıldığını çıkaran bir uygulama yapmayı planladım.

Uygulamaya başlarken öncelikle bir analiz yapan sınıf tasarlamam gerektiğine karar verdim. Analyzer adında bir sınıf oluşturarak işe başladım. Bu sınıf içerisinde de verilen text ifadenin kelimelerine ait bir histogram tablosu çıkaran GetTextHistogram adında metod oluşturdum.


public class Analyzer
{

    public IEnumerable<AnalyzeItem> GetTextHistogram(string text)
    {

       var array = text.Split(' ');
       var result = array.GroupBy(i => i.ToLower())
                         .Select(i => new AnalyzeItem { Word = i.Key, Count = i.Count() });

        return result;

    }

}

public class AnalyzeItem
{
      public string Word { get; set; }
      public int Count { get; set; }
}

Örneği incelediğimizde kelimelerin tekrarlanış miktarını veren bir tip olan AnalyzeItem tipi de göze çarpmakta. Bu tip hangi kelimenin kaç kez tekrar ettiğini bize vermekte. Örneğin  “bayram” kelimesinin kaç defa tekrar edildiğinin sonucunu tutmaktadır.

Burada LINQ nimetlerinden de faydalanmadan yapamadım. Eğer LINQ olmasaydı dizilerle kırk takla atarak sonuca ulaşmaya çalışacaktık.

Programın kullanımı da şu şeklide olacaktır.

static void Main(string[] args){

      string text = "Merhaba syn Ali Veli, size uygun şartlarda kredi imkanı ABCBANK ta. ABCBANK www.abcbank.com da. Kredi almak istiyorsanız ABCBANK a gelin.";

      Analyzer analyzer = new Analyzer();

      var data = analyzer.GetTextHistogram(text);

      foreach (var item in data)
      {
         Console.WriteLine(item.Count + "\t" + item.Word);

      }

}

Dilerseniz uygulamayı bir extension method haline de getirebilirsiniz. Onu da şu şeklide yapmak mümkündür.


public static class Extensions
{
    public static IEnumerable<AnalyzeItem> Histogram(this string text)
    {
       var array = text.Split(' ');
       var result = array.GroupBy(i => i.ToLower())
                         .Select(i => new AnalyzeItem { Word = i.Key, Count = i.Count() });

       return result;
    }

}

Bu extension metodla kodun kullanımı epeyce değişiyor.

static void Main(string[] args)
{
     string text = "Merhaba syn Ali Veli, size uygun şartlarda kredi imkanı ABCBANK ta. ABCBANK www.abcbank.com da. Kredi almak istiyorsanız ABCBANK a gelin.";

     foreach (var item in text.Histogram())
     {
           Console.WriteLine(item.Count + "\t" + item.Word);

     }
}

Artık bütün string tiplere histogram uyglamak mümkün hele geldi.

C# Extension Metod Tanımlama ve Kullanma

11 May

Programlama dillerinde varsayılan olarak gelen tiplere yapılan eklemelere, bir başka deyişle yamalara extension metod diyebiliriz. Bu yazıda, c# ile extension methodların nasıl tanımlandığını, nasıl uygulandığını  ve hangi mantıkla çalıştığını incelemeye çalışacağız.

C# dilinin temel tipleri olan int, string, double ve sayamadığım birçok tip, object tipinden türemiştir ve object tipinin özelliklerini taşımaktadır. Biz de bu özelliklerin yanında gerekli olan metodları bu tiplere ekleyebiliriz.

Örneğin şöyle bir senaryomuz olsun: string türündeki içerikler eğer belli bir karakterden uzunsa (…) şeklinde kısaltılsın.

Bunun için extension metodumuzu hazırlayalım. Extension metodun ulaşılabilmesi için bir static class içerisinde, static bir metod olarak tanımlanması gerekir.


public static class ExtensionString
{
     public static string Kisaltma(this string text, int maxSize)
     {
          return text.Length > maxSize ? text.Substring(0, maxSize).Insert(maxSize, "...") : text;
     }
}

Yukarıda görüldüğü üzere, ExtensionString adında static bir sınıf ve Kisaltma adında static bir metod oluşturuldu. Kisaltma metodu this string şeklinde bir parametre almaktadır. Bu demek oluyor ki Kisaltma metodu, string tipindeki değişkenlere eklenecek. Yani artık her string değişkeni, Kisaltma adında bir metoda sahip.

Burada dikkat edilmesi gereken, extension metodu barındıran sınıfın kullanılmak istenen yerden görünüyor olması gerekir. Yani gerekirse using ile sınıf içerisinde tanımlanmalıdır.


class Program
{
      static void Main(string[] args)
      {
         string baslik = "Bu yazının içeriği ne kadar uzunmuş böyle.";

         Console.WriteLine(baslik.Kisaltma(10));
      }

}

Ekran çıktısı

Kisaltma metoduile 10 karakterden sonra “…” şeklinde devam edilmektedir. Artık istediğimiz yerde bu metodu kullanabiliriz.