eray aydoğdu

jQuery and ASP.NET MVC fanatic.

Asp.net MVC ‘nin Jquery isteklerinde Session Timeout durumu

Şuan geliştirmekte olduğumuz projede get/post işlerinin çok büyük bir bölümü jquery ile yapılıyor. Bu senaryoda şöyle bir sorun ile karşılaştık. Session Timeout a düştüğünde jquery istekleri 503 Server error döndürüyor. Timeout durumunu handle edebilmemiz için şöyle bir yol izleyebiliriz:

Session expire durumunu kontrol edecek methodumuz:

public static bool IsSessionExpired(this HttpSessionStateBase session)
{
    if (session == null || !session.IsNewSession)
    {
        return false;
    }

    string sessionCookie = HttpContext.Current.Request.Headers["Cookie"];
    return sessionCookie != null && sessionCookie.Contains("ASP.NET_SessionId");
}

Uygulamada istediğimiz yerde kullanabilmemiz için yada direkt olarak BaseController da kullanabilmemiz için Attribute oluşturalım.


[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
    public class SessionExpireAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            base.OnActionExecuting(filterContext);
            HttpContext ctx = HttpContext.Current;

            if (ctx.Session != null)
            {
                if (filterContext.HttpContext.Session.IsSessionExpired())
                {
                    var viewData = filterContext.Controller.ViewData;
                    viewData.Model = username;
                    filterContext.HttpContext.Response.StatusCode = 504;
                    filterContext.Result = new ViewResult { ViewName = "SessionTimeout", ViewData = viewData };
                }
            }
        }

    }

Bundan sonra Jquery isteklerinde hata status code unun 504 olup olmadığını kontrol edelim.


   $("#NewTemplate").live("click", function () {
          if (confirmNavigation($(this))) {
              $("#selectedTemplateId").val(0);
              $.ajax({
                  type: "GET",
                  url: Urls.NewTemplate,
                  async: false,
                  cache: false,
                  success: function (cb) {
                      if (!cb) {
                          alert("Hata oluştu!");
                      }
                      else {
                          uiChanges = true;
                          $("#divTemplate").html(cb);
                      }
                  },
                  error: function (xhr, textStatus, errorThrown) {
                      redirectOnSessionTimeout(xhr.status);
                  }

              });
          }
      });

      function loadAuditTableGrid(name) {
        $("#auditTableGrid").load(
            Urls.AuditTable,
            { auditTableName: name },
            function (response, status, xhr) { redirectOnSessionTimeout(xhr.status); });
       }

      //$.getJSON
      reqJSON(Urls.CheckForActiveState, { id: selectedId},
             function (result) {
               if (!result.success)
                  $("#Message").show();
               else
                  $("#Message").hide();

                  }, function (xhr, textStatus, errorThrown) {
                            redirectOnSessionTimeout(xhr.status);
       });

      function reqJSON(url, params, success, error) {
        var CallParams = {};
        CallParams.type = params.Method || "POST";
        CallParams.url = url;
        CallParams.processData = true;
        CallParams.data = params;
        CallParams.dataType = "json";
        CallParams.success = success;
        if (error) {
            CallParams.error = error;
        }
        $.ajax(CallParams);
      }

      function redirectOnSessionTimeout(status) {
        if (status == "504") {
            location.href = Urls.SessionTimeout;
        }
     }

Blog Yazıları ve Sayfalar Yok! – #145 mysql error

Bugün blogumun açılmadığını daha doğrusu açıldığını fakat içerisinin boş olduğunu uyaran bir mail aldım arkadaşımdan. Gerçektende siteme girdiğimde biraz da aceleyle şoka uğradım. Yazdığım makaleler sayfalar vs uçup gitmiş. Biraz araştırdım ancak nafile..

PHP ‘ye de yabancı olduğum için neler olduğunu anlamaya çalışırken phpMyAdmin ‘e girip en azından yazdığım yazıların database de kayıtlı olup olmadığına bakmak geldi aklıma..

Database i açıp ‘wp_posts’ table ına tıkladım ve şu hatayı aldım.

“#145 – Table ‘./DB_NAME/wp_posts’ is marked as crashed and should be repaired”

Google ‘da kısa bir araştırmadan sonra bunun çoğu kişinin başına gelmiş bir hata olduğunu öğrendiğimde çok rahatladım tabi..

Kısaca ‘wp-posts’ table ini onarmamızı istiyor. Onarma işlemide çok basit. Aşağıdaki resimdeki gibi işaretleyip Repair Table dememiz yeterli oluyor.

Bu işlemi yaptıktan sonra başarılı bir şekilde onarıldı mesajı almış olmanız gerekiyor.

Şimdi geriye dönüp blogumuza bakarsak rahat bir nefes alabiliriz. Sayfalarınızın ve yazılarınızın geri geldiğini göreceksiniz.

Bunun yerine şu SQL komutuyla da Repair işlemini gerçekleştirebilirsiniz : REPAIR TABLE `wp_posts`

Sonuç olarak bu korkunç problemi basit birkaç işlemle halledebildiğimizi öğrenmek çok iyi oluyor..

Gözüküp Saklanabilir Pop-up

İşlerin yoğunluğundan ikinci plana attığım blog yazılarına nihayet uzun bi aradan sonra dönüş yapıyorum. Bundan sonra işlerim ne kadar yoğun olursa olsun blog yazılarına zaman ayırmaya çalışacağım. Hızlı ve kısa blog yazıları yolda demek oluyor bu…

Yakın zamanda bir projede ihtiyacım olan bir jquery plug-ini göstereceğim. Adı Meerkat sitede tanıtılandan çok enteresanfarklı bir yerde kullandım ancak ihtiyacınıza çok farklı durumdalarda işe yarayabilir.

Sitesinde de inceleyebileceğiniz gibi ekranın 4 tarafında bir çeşit pop-up açabiliyor, en önemlisi bunu yanlızca tek sefer gösterebiliyorsunuz (Browser session ı sonlanana kadar).

Kullanımına şu şekilde göz atalım:

Öncelikle jquery kütüphanesini ve tabi merkaat ı çağırıyoruz.

<script src="jquery.min.js" type="text/javascript"></script>
<script src="jquery.meerkat.js" type="text/javascript"></script>

Merkaat ın çalışması için gerekli HTML kodlarımızı da aşağıdaki gibi ayarlıyoruz. Gerekli olan html elemanları body etiketinin kapanmasından hemen öncesine classı merkaat olan bir div yerleştiriyoruz.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  <title>Meerkat: A jQuery Plugin (Basic Demo)</title>
  <script src="jquery.min.js" type="text/javascript"></script>
  <script src="jquery.meerkat.js" type="text/javascript"></script>
  <script type="text/javascript">
     $(document).ready(function(){
        //Meerkat
     });
  </script>
</head>
<body>
  <div id="wrapper">
      Web sayfa içeriği burada
  </div>
  <div>
      Meerkat içeriği burada
  </div>
</body>
</html>

Şimdi merkaat kodlarını document ready ye ekleyelim.

$('.meerkat').meerkat({
     background: 'url(images/meerkat-bot-bg.png) repeat-x left top',
     height: '120px',
     width: '100%',
     position: 'bottom',
     close: '.close-meerkat',
     dontShowAgain: '.dont-show',
     animationIn: 'slide',
     animationSpeed: 500
});

Dökümantasyon dosyası ingilizce ancak bilmesenizde belli başlı ayarlar için yardımcı olacaktır. Onun dışında takıldığınız veya sormak istedikleriniz için yorum yazarsanız yardımcı olmaya çalışırım.

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.

RenderAction ile RenderPartial Arasındaki Fark

Asp.net MVC ‘ye çok hakim olmayanların çoğu zaman hangisini kullanması gerektiğine karar veremeyen ve ikisininde aynı işi yaptığını düşünen kişiler için kısaca aralarındaki farktan bahsedelim.Aslında RenderAction ile RenderPartial arasında büyük bir fark var.Aslında RenderAction standart mvc Action ı gibi çalışır. İstediğimiz controller da iken istediğimiz controller daki Action ı çalıştırıp sonucu döndürür. RenderPartial ise aynı controller daki bir VIEW i render eder.

RenderPartial özellikle bir Model belirtilmemişse view ile aynı Model’e sahiptir. RenderAction ise çok daha komplekstir. Kendi actionı ile ayrı bir Model’i olabilir, database’e bağlanabilir vs.

Bir widget’ınız var ve seçim yapamıyorsanız şöyle düşünün. Eğer kompleks işlemler yapacaksanız (database’e bağlanmak, veriler çekmek , datalarla işlemler yapmak vs vs) elbetteki RenderAction kullanmalısınız. Çok daha sade bir widget ise RenderPartial kullanabilirsiniz.

Örnek vererek açıklayayım. Haberler nesneleriyle iligili işlemleri yaptığım bir News controller ım var. Ana sayfada en son haberleri gösteren bir widget yapmak istiyorum. LastNews isimli bir Action oluşturup RenderAction kullanmam en doğru ve pratik bir seçim olacaktır.

Eski Yazılar »