26 Nisan 2016 Salı

scroll hesaplama

<script type="text/javascript">
    $(document).ready(function () {
        var scrollBottom = $(document).height() - $(window).height() - $(window).scrollTop();

        if ('@BasariMsg' != "") {
            setTimeout(function () {
                $('body').scrollTop(scrollBottom - 350);
            }, 2000);

        }
        else if ('@HataMsg' != "") {
            setTimeout(function () {
                $('body').scrollTop(scrollBottom - 350);
            }, 2000);
        }

    });
</script>

22 Nisan 2016 Cuma

MVC Output Cache Kullanımı

Öncelikle herkese merhabalar smiley Bu makalemde Asp.Net MVC uygulamalarında sıklıkla kullanılan bir önbellekleme yöntemi olan OutputCache filter’ının kullanımını inceliyor olacağız. Web projelerinin en büyük sıkıntıları hiç şüphesiz performans kayıplarıdır. Bunu büyük ölçüde absorbe  etmek içinde doğru yerlerde olma şartıyla caching işlemleri yapılır.
Örneğin günde yüzbinlerce kişinin girdiği, hepsiburada.com gibi bir siteyi ele alalım. Kategoriler arasında dolaşıyor, ürünleri inceliyor ve sipariş veriyorsunuz. Ancak hangi sayfada olursanız olun üst tarafta kategorileri hep görüyorsunuz. Yüzbinlerce kişinin bu sitede en az 3 sayfayı gezdiğini bile düşünürseniz kategoriler kısmının her seferinde veri tabanından çekiliyor olması büyük performans kayıpları yaşatacaktır.Sonuçta bu kısım an ve an değişiklik gösterebilen bir bölüm değil. Böyle bir siteye kategori eklenmesi belki birkaç ayda bir gerçekleşir.
Sonuç itibariyle böyle bir durumda yani kısa süreçler içerisinde değişime uğramayan veya anlık bilgi üretmeyen kısımların önbelleklenmesi (caching) büyük ölçüdeki performans kayıplarını bir hayli absorbe edecektir.
Bunun yanı sıra az önce “anlık bilgi üretmeyen…” kısmıyla da belirttiğim gibi durumlarda ise caching yapılması mümkün olup, istenilen sonuçların doğru üretilebilmesi çeşitli konfigürasyonlar ile sağlanabilmektedir.

Caching Çeşitleri

Caching işlemlerini Data Caching ve Output Caching olmak üzere ikiye ayırabiliriz.
Data Cache işlemleri .Net üzerinde, desteklediği tüm veri ve referans tiplerini ön bellekleyebileceğimiz ve her bir istekte ise önbellekten aynı veriyi alabileceğimiz bir model sunar. Böyle bir önbellekleme için yukarıda verdiğimiz örneği ele alırsak, veri tabanına bir kere bağlanılır ve çekilen kategori nesneleri data cache ile ön belleklenebilir.
Makalede inceleyeceğimiz Output Cache modeli ise çıktıların yani render edilmiş View bilgilerinin ön belleklenmesini ve timeout olana kadar gelen her bir istekte ise bir önceki ön belleklenmiş bilgilerin sunulmasını sağlar. Aynı örnek üzerinden ilerleyecek olursak output cache ile kategoriler kısmının ön belleklenmesi için kategoriler kısmını içeren bir PartialView’ın tamamının cache edilmesi gerekir.
Anlık değişim içerisinde olmayan bir çok verinin aynı sayfa üzerinde olacağı durumlarda, toplu bir cache mekanizmasına sahip olduğu için Output Cache kullanımı daha tutarlı bir çözüm olacaktır.
Cache yöntemlerinden ve istisna durumlarından da bahsettiğimize göre artık yapacağımız küçük uygulamalara geçebiliriz laugh
OutputCache kullanım kolaylığı sağlanması için Action Filter sınıfından kalıtılmıştır. Bu sayede Controller veya altında oluşturulabilecek Action’lar için Attribute olarak kullanılabilirler.

OutputCache Attribute'ün Kullanımı

Uygulamalarımızı yapabilmek için bir adet Asp.Net MVC 3 ya da 4 projesi açalım.
HomeController altında GetTime adında bir adet action yaratalım ve aşağıdaki gibi kodlayalım;
namespace MVCAuth.Controllers
{
    public class HomeController : Controller
    {
        [OutputCache(Duration=10)]
        public ActionResult GetTime()
        {
            ViewBag.Date = DateTime.Now.ToString();
            return View();
        }
    }
}
Eklediğimiz Action için birde View ekleyelim ve onu da aşağıdaki gibi kodlayalım;
@{
    ViewBag.Title = "GetTime";
}

<h2>GetTime</h2>
@ViewBag.Date
Projeyi build edip, çalıştırırsanız karşınıza gelecek olan ilk ekranda o andaki saati görüyor olacaksınız. Siz sayfayı açtığınızda ise render edilen bu sayfa arka planda cache edildi ve bundan sonraki 10 saniyelik kısımda ise cache edilen sayfa ile karşılaşacağınız için aynı saat bilgisini görüyor olacaksınız.
Şimdi ise işin en güzel ve söylediğimiz şeylerin tutarlılığını kanıtlayacağımız kısma geldik laugh
Az önce dedik ki, bu sayfaya ilk girdiğimizde sayfa render edildi, bize gösterildi ve cache edildi. Timeout süresi dolana kadarda aynı sayfaya ulaşmaya çalıştığımızda cacheden gelen sayfa ile karşılaşacağız. Bunu bir de projeyi debug ederek irdeleyelim. Yukarıda kodlamış bulunduğumuz GetTime action kodlarındaki ilk satıra (ViewBag.Date...) bir adet breakpoint ekleyelim ve projeyi debug edelim.

Sayfaya ilk girişte akış breakpoint üzerine düşecektir. Fakat 10 saniyelik kısımda sayfaya tekrar ulaşmaya çalıştığınızda sayfa önünüze gelmesine rağmen, akış breakpoint üzerine düşmeyecektir. Bu da cache işlemi boyunca söz konusu action'ın hiç tetiklenmeyeceği anlamına gelmektedir. Teoride bahsettiğimiz şeylerin, gerçekte de örtüştüğünü gördüğümüze göre uygulamalarımıza devam edelim smiley

Client Bazlı Caching

OutputCache ile yapılabilecek cache işlemlerinin lokasyonunu diğer bir değişle baz alınacak referans yerini belirleyebilirsiniz. Bu konuyu derinlemesine incelerken referans edindiğimiz bir yabancı makale vardı (Linki aşağıda bulabilirsiniz) Aslında söz konusu istisna durum için en iyi örneği yaptığı için bende aynı örnek üzerinden devam ediyor olacağım.
Bu kısımda ise yine bir action yazalım. Adı GetUser olan bu action View kısmında membershipte login olmuş olan kullanıcının adını bize göstersin. Böyle bir action'ın yukarıdaki örnekte olduğu gibi cache edilmesi büyük bir istisna oluşturacaktır.
Örneğin kullanıcının adını görmemizi sağlayacak bu action 1 saatliğine cache edilmek üzere ayarlanmış olsun. Bu durumda A kullanıcısı sisteme login olduğu anda bu isim cache edilecektir. 1 saatlik süre içerisinde ise sisteme kim login olursa olsun yine A adını görüyor olacaktır.
Fakat burdaki cache işleminin Client Bazlı yapılması bu sorunu giderecektir. Bu sayede sayfa her bir client için ayrı ayrı cache edilecektir. Ancak burada ise bir performans kaybı yaşanacaktır. Sisteme 10 ayrı kişinin login olup bu sayfayı ziyaret ettiğini düşünürsek, bu sayfa 10 ayrı cache işlemine tabi tutulacaktır. Bu sorunu bir nebze giderebilmek için ise OutputCache işleminin NoStore özelliği kullanılabilir.
NoStore özelliği true olarak set edilen OutputCache işlemlerinde, render bilgileri kalıcı olarak saklanmazlar. Bu örnek için hazırladığım Action ve View kodları ise aşağıdaki gibidir;
namespace MVCAuth.Controllers
{
    public class HomeController : Controller
    {
        [OutputCache(Duration=3600,Location=OutputCacheLocation.Client, NoStore=true)]
        public ActionResult GetUser()
        {
            ViewBag.Name = User.Identity.Name;
            return View();
        }
    }
}
View;
@{
    ViewBag.Title = "GetUser";
}

<h2>GetUser</h2>
@ViewBag.Name
Cache işleminin Client bazlı yapılması için yazılan attribute'e Location özelliğinin Client olarak  ve bilgilerin kalıcı olarak saklanmaması için de NoStore özelliğinin true olarak set edilmesi yeterli olacaktır.

Parametreleri Cache İşleminden Yalıtma

Makalenin girişinde anlık bilgi üreten sayfaların cache edilebilmesi için bazı işlemlerin uygulanacağından bahsetmiştik. Bir adet haber sitesi tasarladığımızı düşünelim. Proje de ise haberlerin detayını gösterecek bir sayfa tasarlıyor olalım. Bunun için yazılacak Detail adlı action ise gösterilecek haberin Id numarasını parametre olarak almaktadır.
Bu sayfanın cache edilmesi halinde, sayfada gösterilecek ilk haber hangisi ise cache timeout olana kadar hangi Id ile sayfa çağrılırsa çağrılsın aynı haber gösterilecektir. Bu durum da Id parametresinin cache işleminden yalıtılması gerekmektedir.
OutputCache mekanizması route value ve query string verilerinin yalıtılmasını VaryByParam özelliği ile sağlayabilmektedir. Yalıtılmak istenilen verilerin bu özelliğe aralarında virgül konularak set edilmesi yeterlidir.
Örnek olarak aşağıdaki kodu inceleyebilirsiniz;
namespace MVCAuth.Controllers
{
    public class HomeController : Controller
    {
        private readonly List<News> newsRepository;

        [OutputCache(Duration=3600, VaryByParam="id")]
        public ActionResult Detail(int id)
        {
            ViewBag.News = newsRepository.Where(q => q.Id == id).SingleOrDefault();
            return View();
        }
    }
}
Yukarıdaki action gelen Id bilgisine göre repoda bulunan haberi çekmekte ve View'e göndermektedir. OutputCache işleminin yukarıdaki gibi yapılması, Id değerinin cache işleminden yalıtılmasını sağlayacaktır.
Bunun yanısıra VaryByParam'ın "*" olarak set edilmesi ise söz konusu action'a gelecek tüm route value ve query stringlerin pragmatik bir şekilde yalıtılmasını sağlayacaktır. Çok fazla parametre alan action'lar için böyle bir yol izlenilmesi, tüm parametrelerin tek tek yazılmasındansa daha kolay bir çözüm sağlayacaktır.
Makaleyi yazarken referans aldığım yabancı kaynağı görmek için buraya tıklayabilirsiniz.
Bir sonraki makalemde görüşmek üzere, herkese esenlikler dilerim :)
H.Burak TUNGUT

Yazar Hakkında

11 Nisan 2016 Pazartesi

database yedekleme işlemleri

http://deryagunduz.com/?tag=sql-serverda-job-olusturma

https://www.mssqltips.com/sqlservertutorial/20/sql-server-backup-database-command/

10 Nisan 2016 Pazar

mvc web.config de dosya mb yükseltme

mvc web.config de dosya mb yükseltme 

<system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxAllowedContentLength="1073741824" />
      </requestFiltering>
    </security>
    <validation validateIntegratedModeConfiguration="false" />

8 Nisan 2016 Cuma

bootstrap modal popup scroll


css  dosyası
.modal-body {
    max-height: calc(100vh - 210px);
    overflow-y: auto;
}


html  dosyası

<!-- Button trigger modal -->
<button class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal">
  Launch demo modal
</button>

<div id="myModal" class="modal fade">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
                <h4 class="modal-title">Modal title</h4>
            </div>
            <div class="modal-body">
                <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque vel vehicula erat. Phasellus vestibulum leo eu mi tempor blandit. Suspendisse eget iaculis lectus. Donec vitae tempus enim, quis tristique magna. Donec lobortis, sem ac pretium viverra, leo nisl consequat arcu, sit amet ullamcorper nunc turpis ac erat. In rutrum auctor ligula, quis mattis enim lacinia eu. Aliquam at magna a erat laoreet iaculis quis a justo. Donec porttitor vulputate massa, nec suscipit nisi mollis sed.</p>
                <p>Praesent sit amet porttitor magna, auctor feugiat tellus. Sed venenatis tortor turpis, vel vestibulum eros pulvinar et. Pellentesque hendrerit diam quis dui euismod tincidunt. Sed sit amet mauris ipsum. Integer in magna tellus. In tincidunt mi quis nunc gravida sollicitudin. Aliquam ac dui eget erat consequat volutpat in eu magna.</p>
                <p>Sed feugiat bibendum leo consequat convallis. Donec facilisis, turpis a scelerisque venenatis, felis diam dictum tortor, vitae imperdiet tortor ligula eu lectus. Donec iaculis semper elementum. Nullam dapibus porttitor magna quis convallis. Morbi porttitor quam non magna ullamcorper rhoncus. Phasellus sit amet nunc at turpis pharetra luctus a a massa. Praesent luctus massa in odio faucibus eleifend.</p>
                <p>In eget lobortis leo, ut luctus odio. Mauris pharetra erat ac tellus hendrerit semper. Cras faucibus ipsum id ante hendrerit rutrum. Donec vitae ullamcorper arcu. Aliquam pellentesque faucibus placerat. Aliquam erat volutpat. In tincidunt metus sit amet ligula sagittis vehicula. Pellentesque velit quam, hendrerit a erat ac, fermentum tincidunt enim. Cras suscipit justo nec consectetur lacinia.</p>
                <p>Cras pellentesque urna a leo egestas, at ullamcorper augue suscipit. Nulla id lacinia magna, non iaculis est. Praesent a placerat augue, eget eleifend purus. Aenean dignissim, orci et rutrum facilisis, tellus massa porta nulla, quis hendrerit dui ipsum vitae urna. In mattis lectus dolor, id venenatis lectus pellentesque at. Suspendisse posuere metus vel bibendum dignissim. Fusce interdum magna id libero scelerisque suscipit. Duis orci augue, rhoncus eget pharetra ac, viverra nec magna. In accumsan nulla ac suscipit pellentesque. Nulla iaculis luctus tellus, at ultricies urna hendrerit a. Aenean vehicula sodales varius. Duis sodales hendrerit odio non sagittis.</p>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                <button type="button" class="btn btn-primary">Save changes</button>
            </div>
        </div>
        <!-- /.modal-content -->
    </div>
    <!-- /.modal-dialog -->
</div>
<!-- /.modal -->
kaynak : http://jsfiddle.net/jasny/zclse/

6 Nisan 2016 Çarşamba

Mvc İletişim Formundan Mail Gönderme


İletişim Formuna post edildiğinde Mail gönderme işlemi  

[HttpPost]
        public ActionResult iletisimformu(iletisimForm Model)
        {

            string hataMsg = string.Empty;
            string basariMsg = string.Empty;
         try
            {     if (ModelState.IsValid)
                    {
                        var islem = Gonder(Model);
                        if (islem)
                        {
                            ModelState.Clear();
                            basariMsg = "İşlem başarılı";
                        }
                        else
                        {
                            hataMsg = "İşlem sırasında bir hata oluştu...";
                        }
                    }
                    else
                    {
                        hataMsg = "'*' alanları doldurunuz";
                    }
               
            }
            catch (Exception ex)
            {
                hataMsg = ex.Message;
            }

            ViewData["Hata"] = hataMsg;
            ViewData["Basari"] = basariMsg;

            return View();
        }

 public bool Gonder(iletisimFormModel)
        {
   StringBuilder sb = new StringBuilder();

                           sb.Append(string.Format("<strong>Adı Soyadı : </strong> {0}<br/>", Model.AdSoyad));
                            sb.Append(string.Format("<strong>Telefon : </strong> {0}<br/>", Model.Telefon));
                            sb.Append(string.Format("<strong>Eposta : </strong> {0}<br/>", Model.Eposta));
                            sb.Append(string.Format("<strong>Ev Adresi : </strong> {0}<br/>", Model.EvAdresi));
                     
                            sb.Append(string.Format("<strong>Doğum Tarihi : </strong> {0}<br/>", Model.DogumTarih));
                            sb.Append(string.Format("<strong>Cep Telefonu : </strong> {0}<br/>", Model.CepTelefon));
               
                            return Helper.MailGonder(ayar.EvdeBakimHizmetleriEpostaAdresi, sb.ToString(), "Evde Bakım Formu");

}
   public static class Helper
    {
   public static bool MailGonder(string AlanMail, string Yanit, string Konu)
        {
            try
            {

                MailMessage Mesaj = new MailMessage();
                Mesaj.From = new MailAddress("info@durmusyilmaz.com.tr");
                Mesaj.To.Add(AlanMail);
                Mesaj.Subject = Konu;
                Mesaj.Body = Yanit;
                Mesaj.IsBodyHtml = true;
                SmtpClient smtp = new SmtpClient("mail.durmusyilmaz.com.tr", 587);
                System.Net.NetworkCredential SMTPUserInfo = new System.Net.NetworkCredential("info@durmusyilmaz.com.tr", "*******");
                smtp.UseDefaultCredentials = true;
                smtp.EnableSsl = true;
                smtp.Credentials = SMTPUserInfo;
                smtp.Send(Mesaj);
                return true;
            }
            catch { return false; }
        }
}

4 Nisan 2016 Pazartesi

add this aynı sayfada farklı paylasım oluşturma

 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <title>@ViewBag.Title - My ASP.NET MVC Application</title>
    <link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" />
    <meta name="viewport" content="width=device-width" />

</head>
<body>

  <div class="share-btn addthis_toolbox">
                                    <a class="addthis_button_facebook">addthis_button_facebook
                                    </a>
                                    <a class="addthis_button_twitter">
                                        <span class="hiper-twitter"></span>addthis_button_twitter
                                    </a>
                                    <a href="#" class="addthis_button_more" target="_blank" title="View more services">
                                    +
                                    </a>
                                    <div class="atclear"></div>
 </div>


 <script type="text/javascript" src="//s7.addthis.com/js/300/addthis_widget.js" async="async"></script>
    <script type="text/javascript">
        $('.addthis_button_more,.addthis_button_facebook,.addthis_button_twitter').click(function () {
            addthis.init();
            var pUrl;
            pUrl = "@Request.Url" + "/sharer/" + window.location.href.split('#')[1].split('/')[0].replace('item', '');
            console.log(pUrl);
            addthis.update('share', 'url', pUrl);
            addthis.toolbox('.addthis_sharing_toolbox-CUSTOM');
        });
    </script>
</body>

</html>