eray aydoğdu

jQuery and ASP.NET MVC fanatic.

Pro ASP.NET MVC 3 Framework Alpha

ASP.NET MVC 3 Framework bize temiz kod yapısı, esneklik, ve test-driven development yapıları birleştirerek ASP.NET 4 ‘ün tüm nimetlerinden faydalandırıyor. MVC 1 ve MVC 2 serisinin 3. kitabı olan ASP.NET MVC 3 Framework ü anlatacak olan Pro ASP.NET MVC 3 kitabının alpha sürümü yayınlandı. 6 MB boyutunda PDF haline internette ulaşmanız mümkün.

Tam sürümünün çok yakında çıkacağı duyuruldu ancak önizleme olarak alpha sürümüne gözatmanızda fayda var.

Tam sürümü çıktığında da detaylı anlatım yapacağım.

Pro ASP.NET MVC 2 Framework Second Edition Kitabı

MVC 1 i çok başarılı olan kitabın 2 sinin de de gayet iyi anlatılmış bu konuda piyasadaki en iyi kitap diyebilirim. MVC 2 yle birlikte gelen yenilikleri C# 4.0 ı, MVC 2 le MVC 1 kıyasladığınızda işimizi birazcık daha azalttığını kitaptaki örnek kodlar ve anlatım ile görebilirsiniz..

MVC 1 versiyonunu okuyanlar bilir yine SportsStore örneği mevcut diğerinde çok daha detaylı ve daha kalın olan bu versiyonununda pdf i işini görecektir.

MVC 3 e geçmeden önce bu kitaba göz gezdirip bir kaç uygulama yaparsanız. MVC 3 te hiç zorluk çekmezsiniz.

Asp.Net MVC Çoklu Dil Desteği

İki dil site yapımı ya da çoklu dil desteği olan bir site yapımı için session veya cache yöntemi de kullanılabilir fakat profesyonel bir uygulamada bu en iyi çözüm yolu değil. Bunun en güçlü ve pratik yolu dil değişkenini asp.net mvc nin url routing mekanizmasını kullanarak saklamaktır.

Amaç url nin şu şekilde gözükmesini sağlamak : /{culture}/{Controller}/{Action} yani /tr/Home/About

Öncelikle MvcRouteHandler class ını extend etmemiz gerekiyor. Culture parametresi için MultiCultureMvcRouteHandler ve culture parametresi kullanmayacağımız SingleCultureMvcRouteHandler class larımızı oluşturalım.

Custom Route Handlers oluşturalım

public class MultiCultureMvcRouteHandler : MvcRouteHandler
{
    protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        var culture = requestContext.RouteData.Values["culture"].ToString();
        var ci = new CultureInfo(culture);
        Thread.CurrentThread.CurrentUICulture = ci;
        Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(ci.Name);
        return base.GetHttpHandler(requestContext);
    }
}

Base implementation ını çağırmadan önce GetHttpHandler override ederken RouteData collection ından culture parametresini alıyoruz, CultureInfo objesi yaratıp current culture ve current thread özelliklerini ayarladık.

public class SingleCultureMvcRouteHandler : MvcRouteHandler {}

Bu class ı culture yani dil ayarı yapmamızı gerektirmeyen sayfaları için kullanacağız.

Registering Routes (Route larımızı tanımlayalım)

Global.asax dosyasındaki RegisterRoute() methodumuzu açalım. Default route tanımlamasının altına aşağıda ki foreach blogunu ekleyelim.

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
         "Default", // Route name
         "{controller}/{action}/{id}", // URL with parameters
         new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
    );

    foreach (Route r in routes)
    {
        if (!(r.RouteHandler is SingleCultureMvcRouteHandler))
        {
            r.RouteHandler = new MultiCultureMvcRouteHandler();
            r.Url = "{culture}/" + r.Url;

           if (r.Defaults == null)
           {
               r.Defaults = new RouteValueDictionary();
           }
           r.Defaults.Add("culture", Culture.tr.ToString());

           if (r.Constraints == null)
           {
               r.Constraints = new RouteValueDictionary();
           }
           r.Constraints.Add("culture", new CultureConstraint(Culture.en.ToString(),
Culture.tr.ToString()));
        }
   }

}

Culture enum ve CultureConstraint class larımızıda oluşturalım.

public class CultureConstraint : IRouteConstraint
{
    private string[] _values;
    public CultureConstraint(params string[] values)
    {
        this._values = values;
    }

    public bool Match(HttpContextBase httpContext,Route route,string parameterName,
                        RouteValueDictionary values, RouteDirection routeDirection)
    {

        string value = values[parameterName].ToString();
        return _values.Contains(value);

    }

}
    public enum Culture
    {
        tr = 1,
        en = 2
    }

Dil değiştirme İşlemi

Dil değişikliği yapmak için aşağıdaki gibi basit bir Action ımız var. AccountController mıza koyabiliriz. İstersiniz HomeController a da koyabilirsiniz.

public ActionResult ChangeCulture(Culture lang, string returnUrl)
{
     if (returnUrl.Length >= 3)
     {
         returnUrl = returnUrl.Substring(3);
     }
     return Redirect("/" + lang.ToString() + returnUrl);
}

İkinci dil e geçmek için CultureSwitchControl.ascx adında bir partial view oluşturdum. Bununda kodu aşağıda ki gibi:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>

<%= Html.ActionLink("eng", "ChangeCulture", "Account",
    new { lang = (int)MvcLocalization.Helpers.Culture.en, returnUrl =
    this.Request.RawUrl }, new { @class = "culture-link" })%>

<%= Html.ActionLink("tr", "ChangeCulture", "Account",
    new { lang = (int)MvcLocalization.Helpers.Culture.tr, returnUrl =
    this.Request.RawUrl }, new { @class = "culture-link" })%>

Tek Dil

Eğer tek dile ihtiyaç duyacağımız sayfalar olursa onuda RouteHandler ını SingleCultureMvcRouteHandler olarak Global.asax ta tanımlamamız gerekecek.

routes.MapRoute(
          "AboutRoute",
          "About",
          new { controller = "Home", action = "About"}
   ).RouteHandler = new SingleCultureMvcRouteHandler();

Localization işlemi bu kadar.

Çok dilli web uygulaması yaparken karşınıza iki sorun daha çıkacak. Telaşlanmayın işin zor kısmını zaten hallettiniz. Geriye sayfa içinde ki sabit yazılar (örn. “Son Yazılar”,”Son Yorumlar”) ve dile göre değişecek resimler bannerler. Bu sorunu Resources Files kullanarak çok basit atlatabilirsiniz. Ancak resimler için tavsiyem 2 ayrı klasör oluşturup (tr ve en) adında dillere ait dosyalarınızı bu klasörlere atmanız ve sayfa içinde kullanacağınız zaman url deki parametreyle aynı olan dosya adınıza yol vermenizdir örneğin;

../../Content/tr/logo.jpg ve ../../Content/en/logo.jpg şeklinde url deki parametreyi sayfa içine taşırsanız(ister class yapın ister ViewData[“dil”] ile taşıyın farketmez) bu sorunu halledebilirsiniz.

Sabit yazılar içinse yine aynı yöntemi kullabilirsiniz fakat çok uzun sürebilir o yüzden tavsiyem Resources Files kullanmanızdır. bu konuda ufak bir araştırma ile çok sayıda dökümana ulaşabilirsiniz, üstelik kullanımı çok kolay

Üyelik Aktivasyon E-Mail’i ASP.NET MVC Membership Framework

Her zamanki gibi yeni üye oluşturuyoruz.Ancak isApproved özelliğini false olarak ayarlıyoruz ki aktivasyon işlemini yani true yapma işlemini kayıt olan kullanıcı e-posta aktivasyonunu doğrulayarak gerçekleştirsin.
(more…)

Asp.net MVC Projesini Yayınlama (Publish Etmek)

Hostda projeyi çalıştırmak için MVC dll’lerine bağlı. MVC bileşeni hostta yüklü ise sorunsuzca çalışır. Ancak bu bileşen yüklü değilse gereken bileşen dosyalarını projemize eklemeliyiz. Ayrıca MVC projesini hostta atıp çalıştırmak için ise Asp.net’te olduğu gibi projeyi publish ederek sunucuya atabiliyoruz.

(more…)