Osman KURT

Yazılım Uzmanı | MVC Eğitmeni

MVC'de BundleConfig Kullanımı Ve Performans Artışı

MVC projelerimizin default oluşumunda gelen bir özellik ve Microsoft gerçekten bu özelliği kullanmamızı istiyor.
Kullanımı basit, sayfa içerisinde o kadar çok css ve script tanımlıyoruz ki bazen biz bile ne nerden geliyor karıştırıyoruz. İşte bundle tam da bunu engellemek için yapışmış birşey.

Karışıklığı önlediği gibi eklediğimiz css ve js dosyalarını da optimize ederek, yüklemeden yani performansdan tasarruf sağlıyor ve bu sayede arama motorlarının bizi üst sıralara taşımasına yardımcı oluyor.

Gelelim kullanımına;
MVC projemizde ki App_start kalsöründe bulunan BundleConfig.cs dosyamıza alt örnekte olduğu gibi css ve scriptlerimizi ekliyoruz. İstediğimiz gibi ekleyebiliriz. Ezme durumlarından dolayı parça parça olarak ta ekleyebilirsiniz.


            bundles.Add(new ScriptBundle("~/bundles/modernizr").Include(
                        "~/Scripts/modernizr-*"));

            bundles.Add(new StyleBundle("~/Content/css").Include("~/Content/site.css"));

            bundles.Add(new StyleBundle("~/Content/themes/base/css").Include(
                        "~/Content/themes/base/jquery.ui.core.css",
                        "~/Content/themes/base/jquery.ui.resizable.css",
                        "~/Content/themes/base/jquery.ui.selectable.css",
                        "~/Content/themes/base/jquery.ui.accordion.css",
                        "~/Content/themes/base/jquery.ui.autocomplete.css",
                        "~/Content/themes/base/jquery.ui.button.css",
                        "~/Content/themes/base/jquery.ui.dialog.css",
                        "~/Content/themes/base/jquery.ui.slider.css",
                        "~/Content/themes/base/jquery.ui.tabs.css",
                        "~/Content/themes/base/jquery.ui.datepicker.css",
                        "~/Content/themes/base/jquery.ui.progressbar.css",
                        "~/Content/themes/base/jquery.ui.theme.css"));
Not düşmek gerekir se * işaretleri siz sürüm notu bildirmeden va olan sürümün numarasını almaya yarıyor.
Ön yüzde çağırmak gerekirse;

    @Styles.Render("~/Content/css")
    @Scripts.Render("~/bundles/modernizr")

Kullanım gördüğünüz gibi bu kadar basit. Üst kısımda ki kodu sayfamızın neresinde css ve js dosyalarımızın çıkmasını istiyorsak oaraya kaymamız gerekiyor.

Yazımın başında da dedim ya optimize diye bir durum da var. İşte onun içinde BundleConfig.cs dosyamızın içine en üst kısımda ki paylaştığım kodun altına

   BundleTable.EnableOptimizations = true;
Eklememiz gerekiyor.

Örnek Dosya İçin

Görümek üzere,

Osman KURT
Yazılım Uzmanı & MVC Eğitmeni

Yeni Başlayanlar İçin MVC Eğitimi

Daha önceki yazılarımda mvc eğitimim verdiğimi belirtmiştim. Bunu yenilemekte fayda görüyorum. Arkadaşlar ben İstanbul'da ikamet ediyorum bu yüzden yüz yüze eğitimlerde haliyle İstanbul içi olmak durumunda. Şehir dışında olan arkadaşlar için de uzaktan bağlantı programalrı sayesinde gerekli eğitimi gerçekleştirebiliyorum.



Bununla alakalı birçok arkadaş mail ile bağlantı sağladıkları için bu yazıyı paylaşma gereği duydum.

Eğer ki siz de mvc eğitimi almak istiyorsanız info@osmankurt.net adresinden yada iletişim formundan bana ulaşabilirsiniz. İlk aşamada lütfen ikamet ettiğiniz il ve ilçe bilginizi paylaşınız.

İlginiz için çok teşekkür ederim.
Görüşmek üzere

Osman KURT

C# .Net de İpucu

Başlıktan da anlayacağınız üzere bir ipucu ile karşınızdayım.
Daha önceden method hazırlarken parametrelerde ref diye bir tanımlama kullandınız mı?

Kısaca açıklamak gerekirse, çalışacak method'dan önce bir değişken tanımladınız ve tanımladığınız değişkeninizin method çalıştıktan sonra dinamik olarak değerinin update edilmesini ve bu değişimin de method içinde işlendikten sonra gerçekleşmesini istiyorsunuz. Methodunuz da return değeri olarak bu parametre ile alakalı herhangi birşey döndürmüyor. O zaman ref diye bir tanımlamamız var. Alt kısımda ki kod örneği tam da bunu açıklıyor.

İnanın bana gerektiği yerde kullanınca siz de ne kadar harika olduğunu göreceksiniz. Sadece yazı ile anlatmak biraz zorluyor insanı :)

Örnek Method;

    public class OrnekDeneme
    {
        public static void deneme(ref bool osmankurt)
        {
            osmankurt = true;
        }
    }
Kullanımı;
            bool osmankurt = false;
            OrnekDeneme.deneme(ref osmankurt);
            var deger = osmankurt;

Görüşmek üzere
Osman KURT
Yazılım Uzmanı & MVC Eğitmeni

MVC'de Captcha Kullanımı

Yakın bir tanıdığımın işine yaracağı için üzerinde çalıştığım bir örnek, basit ama hayat kurtarır. Günümüz teknolojisnin insan hayatında bazen bıkkınlık verir derecesine rahatsızlık verdiğinin farkındayız.

Bunlarda yazılan otomatik sistemlerin payı büyük. Yazılım tekniklerinin gelişmesi ile suistimal oranlarıda arttı haliyle.

Nasıl mı?

Reklam amaçı yazılan botlar gibi.
İşte bunları engellemenin  en önemli faktörlerinden bir tanesi Captcha kullanımı. Yani karşımızda ki kullanıcının insan olduğunu anlamak.

Onu da nasıl yapıyoruz bakalım şimdi.
Oluşturduğumuz bir projenin HomeController kısmına şu kodu yazıyoruz;

public ActionResult CaptchaImage(string prefix, bool noisy = true)
       {
            int i, r, x, y;
            var rand = new Random((int)DateTime.Now.Ticks);
            int a = rand.Next(10, 99);
            int b = rand.Next(0, 9);
            var captcha = string.Format("{0} + {1} = ?", a, b);
            Session["Captcha"] = a + b;
            FileContentResult img = null;
            using (var mem = new MemoryStream())
            using (var bmp = new Bitmap(130, 30))
            using (var gfx = Graphics.FromImage((Image)bmp))
            {
                gfx.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
                gfx.SmoothingMode = SmoothingMode.AntiAlias;
                gfx.FillRectangle(Brushes.White, new Rectangle(0, 0, bmp.Width, bmp.Height));
                if (noisy)
                {
                    var pen = new Pen(Color.Yellow);
                    for (i = 1; i < 10; i++)
                    {
                        pen.Color = Color.FromArgb((rand.Next(0, 255)),(rand.Next(0, 255)),(rand.Next(0, 255)));
                        r = rand.Next(0, (130 / 3));
                        x = rand.Next(0, 130);
                        y = rand.Next(0, 30);
                    }
                }
                gfx.DrawString(captcha, new Font("Tahoma", 15), Brushes.Gray, 2, 3);
                bmp.Save(mem, System.Drawing.Imaging.ImageFormat.Jpeg);
                img = this.File(mem.GetBuffer(), "image/Jpeg");
            }
            return img;
        }

Daha sonra ön tarafa geçiyoruz ve kullanıcılarımıza göstereceğimiz resim parçasını ayarlıyoruz. Bunun için de alt kısımda ki kod bloğunu kullanıyoruz.

<script>
    function GetCaptcha() {
        $("#rsm").attr('src', '/Home/CaptchaImage?' + new Date().getTime());
   }
</script>
<img src="@Url.Action("CaptchaImage")" id="rsm" style="" />
<input type="button" value="Yenile" onclick=" return GetCaptcha()" />

Post ettiğimiz zaman doğruluk kontrolünü,
if (Session["Captcha"] == null || Session["Captcha"].ToString() != model.Captcha)
{
     //hata mesajı
     return View(model);
}

Session da tuttuğumuz captcha verisi ile kullanıcının girdiği veriyi karşılaştırıyoruz ve kontrolümüzü sağlıyoruz.

Görüşmek üzere
Osman KURT
Yazılım Uzmanı & MVC Eğitmeni

MVC Partial Sayfa Kullanımı

Asp.Net de alışık olduğumuz UserControl olayımızın MVC'deki karşılığıdır. Birden fazla yerde kullanılabilecek sayfaları Partial sayfa olarak oluşturup ilgili alana eklenmesi ile çalışan bir yapıdır.

Öncelikle Shared klasörümüze sağ tıklanır ve New Item denildikten sonra MVC sekmesinde ki Partial Page seçilir. Önümüze boş bir sayfa gelecek artık bu bizim kullanımımıza açık bir UserControl yeni adı ile Partial sayfamızdır.

Bunun içine html olarak gelmesini istediğimiz şeyleri yazarız.

Tabi birde bunun çağırlıma kısmı var. Bunun birden fazla kullanım tarzı var ama katmanlı yapılarda genel olarak kullanılan şeklini göstereceğim.

Öncelikle kullanacağımız sayfanın neresinde çıkmasını istiyorsak o kısma;

@Html.Action("PartialDeger", "Home")


yazıyoruz. Bu kod bize Home controller altında ki PartialDeger actionresult kısmına git orada ne söyleniyorsa bana onu yap demek. Şimdi gelelim PartialDeger actionresult kısmını yazmaya.

O kısımda;

public ActionResult PartialDeger()
{
     return PartialView("_osmankurt");
}


Kod okuyucumuz bu kısma geldiğinde geriye _osmankurt adlı partialpage döndüreceğini anlıyor ve bana PartialPage sayfamda ne varsa onu döküyor.

Bu yapıda model kullanımıda mevcut tabi ki ama o da diğer yazımıza kalsın ;)

Görüşmek üzere,

Osman KURT
Yazılım Uzmanı

Json Veriyi Serializer ve Deserialize Etme

Projelerimiz de bolca kullanmakta olduğumuz json veri alışverişini sağlarken kullanmamız gereken bir method. Göndereceğimiz veriyi json formatına çevirirken yada gelen json veriyi istediğimiz formata çevirirken kullanmaktayız ve olmazsa olmazlarımızdan.

Örnek kod parçası;

        public static string JsonSerializer<T>(T t)
        {
            DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
            MemoryStream ms = new MemoryStream();
            ser.WriteObject(ms, t);
            string jsonString = Encoding.UTF8.GetString(ms.ToArray());
            ms.Close();
            return jsonString;
        }

        public static T JsonDeserialize<T>(string jsonString)
        {
            DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
            MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
            T obj = (T)ser.ReadObject(ms);
            return obj;
        }

 


Görüşmek üzere,

Osman KURT
Yazılım Uzmanı

 

ASP.Net'de Encoding ve Decoding Yapımı

Kullanım yerleri farklılık gösterebilir fakat daima işimize yarayacak bir kod bloğu. Özellikle QueryString ile veri gönderirken açık olarak parametre göndermek ciddi bir güvenlik zafiyetidir. İşte tamda bu alanda kullanmamız gereken bir özellik.

public static string Encode(this string str)
        {
            byte[] toEncodeAsBytes = UnicodeEncoding.Unicode.GetBytes(str); 
            return Convert.ToBase64String(toEncodeAsBytes);
        }

 

public static string Decode(this string str)
        {
            byte[] encodedDataAsBytes = Convert.FromBase64String(str);
            return UnicodeEncoding.Unicode.GetString(encodedDataAsBytes);
        }

Görüşmek üzere

Osman KURT
Yazılım Uzmanı

MVC 5 İLE GELEN ROUTE YENİLİĞİ

.Net platformunda mvc'nin bize kattığı en büyük değerlerden diyebileceğim route özelliği her geçen gün yazımcılar için daha akıllıca bir hal almaya başladı. Arama motorlarının son 8 yıl içinde trendinin hızlıca arttığını düşünecek olursak, aramalarda çıkma ihtiyacı bir o kadar arttı ve tendi yüksek bir hal almaya başladı.

Arama motolarlarında çıkmanın en iyi yolu ise özgün bir içerik ve bunu arama motorlarına sunabilecek iyi bir altyapı yani route da diyebiliriz bunun içinde. Siz her ne kadar iyi bir içerik oluştursanız da bu kullanıcılara ulaşmadığı sürece başarı kazanılmış sayılmaz. Kullanıcı ise size büyük oranda arama motorları üzerinden gelecektir. Unutmatalım ki biz facebook.com'a google'a face yazarak giren bir milletiz.

Eğer ki uzun zamandır bu işi yapıyosanız benim ne demek istediğimi anlıyorsunuz demektir.

Gelelim yeniliğimize, bildiğiniz üzere mvc'de route özelliği default olarak Controller/Action/id şeklinde çalışmaktadır. Merak etmeyin yine aynı şekilde devam ediyor. Bu tanımla genel olarak yaptığımız birşey. İstediğimiz gibi editleyebiliyor ve çoğaltabiliyoruz.

MVC 5 ile gelen yenilik ise bunu action'a göre tanımlama. Evet yanlış duymadınız her action için ayrı bir route yapısı tanımlamadan bahsediyorum. Yani Home/Contact altında olan bir sayfaya action adını değiştirmeden osmankurt/banaulasin yazarak gitmekten bahsediyorum.

Kullanım alanını siz bulacaksınız hangi amaçla nerde nasıl kullanırsınız size kalmış.

Alt kısımda örneğini paylaşıyorum. Tek yapmanız gereken,

 RouteConfig dosyasına yeşil yazı altında ki kodu ekliyoruz.

 

Örnek kodun kullanımı ise;

görüşmek üzere,

Osman KURT
Yazılım Uzmanı

MVC Projelerde Login Kontrolü Yapma Authorize Kullanımı

Bir proje yaptık ve admin panelimiz var yada kullanıcı girişi olduğunu varsaydığımız herhangi bir yer. Bunu ya session yada cookie kullanarak sağlarız. İf koşulumuzu koyarız ve yolumuza devam ederiz. Şimdi şöyle bir durum var. MVC de sayfalar actionresult'lardan oluşmakta hepsi için tek tek if mi yazacağız tabiki hayır. Gerekli gördüğümüz yerde yazabiliriz tabiki ama bir admin paneli için bunu te tek yazmak yazılım hammallığından başka birşey değil tabiki.

Gelelim bu olayı tek bir kod bloğu ile nasıl yapacağımıza. MVC bize authorize diye bir nimet sunmuş ve bunu istediğimiz gibi editlememize olanak sağlamış.

İlk yapmamız gereken kendimize bir class tanımlamak ve bu classı MVC de AuthorizeAttribute sınıfından türetmek. olacak. Daha sonra bu classımızın içine bize bool değer döndüren bir overried bir method yazıyoruz ve if koşulumuzu burada sağlıyoruz. Duruma göre True yada False döndürerek işlemimizin gerçekleşmesini sağlayacağız ve controller'a kullanıcının erişim hakkının olup olmadığını sağlayacağız.

Kod bloğumuz alt kısımda ki gibi;

public class UserAuthorize : AuthorizeAttribute
    {
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            if (httpContext.Request.Cookies["osmankurtnet"] != null)
            {
                return true;
            }
            else
            {
                httpContext.Response.Redirect("/Yonetim/Login/Index");
                return false;
            }

        }
    }

Authorize kodumuzu tamamladığımıza göre sıra onu controller alanımızda kullamaya geldi. Onuda alt kısımda ki gibi kullanıyoruz.

[UserAuthorize]
public class AdminController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
 }

Bu kodumuzu da bu şekilde kullanıyoruz ve istediğimiz şekilde sisteme giriş yetkisi verebiliyor yada engelleyebiliyoruz.

Görüşmek üzere

Osman KURT
Yazılım Uzmanı

MVC Projelerde Editör Kullanırken Alınan HTML Hatası

Mvc proje yazarken genellikle panellerimiz de editör kullanırız. Çünkü eklemek istediğimiz yazılarımıza istediğimiz html taglarını runtime da rahatlıkla vermemize olanak sağlarlar. Birçok örnek verebiliriz bu editörlere ben genellikle CKEditor kullanıyorum.

Gerekli script dosayalarımızı projemize eklediğimizi varsayıyorum ve sayfamızda editörümüzü gördük ve kaydet butonumuza bastık. Karşımıza bir hata çıktı hata içeriğinde html taglarının tehlikesinden bahsediyor. ASP.Net yazarken .aspx sayfalarımıza validatrequest=false diye kullandığımız kodumuz aklımıza geliyor ve bunu mvc deki karşılığını arıyoruz. Bu sefer bu kodumuzu yeni tabirle view sayfamıza değilde controller kısmında controller name alanımızın en başına yazıyoruz.

Kod bloğu alt kısımda mevcut;

    [ValidateInput(false)]
    public class AdminController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
     }

Kodumuz bu kadar artık istediğimiz gibi editörümüze hükmedebiliriz.

Osman KURT
Yazılım Uzmanı