eray aydoğdu

jQuery and ASP.NET MVC fanatic.

Asp.Net MVC ile WordPress Birlikte Çalıştırma

Asp.net mvc uygulamasının içerisinde wordpress blogunu entegre ederek çalıştırabiliriz. Dikkat etmemiz gereken bir kaç detay dışında son dönemlerde microsoft’un php’ye gösterdiği ilgilinin artmasıyla windows server lar üzerinde bunu yapmak oldukça kolay.

Aslında Asp.Net ve PHP iis6 ve iis7 üzerinde de birlikte çalışabiliyor. Ben iis6 üzerinde yaşadığım sorunu anlatarak iis7 de neler yapmamız gerektiğini ve en verimli çalışma performansını iis7 de iken aldığım için sizede iis7 üzerinde yayınlamınızı şiddetle öneririm.

IIS6 da php çalıştırabiliyoruz ancak bildiğimiz gibi windows server larda .htaccess dosyası yok ve ihtiyacımız olan google dostu url ler üretebilmemiz için birkaç ayar yapmamız gerekiyor. Dolayısıyla bu ayarları yapamadığımız için iis6 da yayın yapan wordpress uygulamasının url’sinde geçen /index.php den bir türlü kurtulamıyoruz. WordPress yapısını çok seven google için olsun veya çok esnek olan wordpress yapısında sınırlandığımız için ben hiç hoşlanmadım. Performans açısından da bazı sıkıntılar çıkartabiliyor. O yüzden iis6’da macera aramaya gerek görmeyelim derim.

Şimdi bu iki projeyi nasıl birleştireceğimize gelelim.

Hali hazırda bulunan mvc uygulamasının içerisinde blog diye bir klasör açalım.(menü’ye Blog diye bir kategori ekleyeceğimizi varsayıyorum. Eğer farklı bir isim vermek isterseniz elbette yapabilirisiniz.)

Gördüğünüz gibi normal projemin içerisinde blog adında bir klasör açtım ve içerisine wordpress dosyalarımızı attık. Burada WordPress in kurulumunu anlatmayacağım eğer istek olursa onuda farklı bir yazıda anlatabilirim. Ayarlarını yapıldığını varsayalım şimdilik ve bir sonraki adıma geçelim.

Bizim asp.net mvc uygulamasını çalıştırdığımızda içerisinde wordpress uygulamasının da çalışmasını istediğimizden oluşturduğumuz klasör ile aynı isimde menümüze bir bir kategori ekliyoruz.

Oluşturduğumuz menüye blog adında bir kategori ekledik ancak url’sini “/blog” olarak vermeliyiz.

Daha sonra Global.asax dosyasını açıyoruz ve RegisterRoutes methodunun en başına aşağıdaki kodları ekliyoruz.

routes.IgnoreRoute(“blog”);
routes.IgnoreRoute(“blog/*”);

Bu kodlar MVC projemize gelen “blog” isteğini contoller olarak algılamasın diye reddettiğimiz istekler.Yani siteadi.com/blog diye bir istek geldiğinde MVC yapısı gereği bunu ilgili route’a yönlendirmesi yerine bunu yoksaymasını belirtiyoruz. Böylece blog klasörünü MVC RouteCollection dan çıkardığımız için blog klsöründeki Worpress PHP kodları çalışmaya başlıyor. Denemek için blog klasörüne herhangi bir html dosyası atabilirsiniz. İçerisinde Merhaba yazan bir index.html atıp test edebilirsiniz.

Bu işlemler sonucunda Her iki dilde geliştirilmiş olan projeleri aynı proje içerinde entegre olarak çalıştırabilirsiniz. Bir sonraki yazımda Asp.Net MVC uygulamasında bir wordpress sitesinin en son post larını rss reader ile nasıl çekebileceğimize değineceğiz.

301 Yönlendirmesi Nasıl Yapılır

Bu yazımızda Asp.Net MVC ile 301 yönlendirmesi nasıl yapılacağını göreceğiz. Geçenlerde google da üst sıralarda bulunan bir sitemizin duplicate content ve gereksiz url uzaması yüzünden daha önce mantıklı gelen url yapısını (etiket/{etiketadi}/{etiketid}) değiştirmeye karar verdik. Fakat google indexlerimizin de silinmesi optimizasyon ve sitemizin sırasını etkileyebileceğinden 301 yönlendirmesi yapmaya karar verdik. Şimdi kısaca bunu nasıl yapılacağını göreceğiz. Aslında çok basit bir kaç ufak değişiklik.

Öncelikle site içinde verdiğimiz etiket linklerini yeni yapımızla yani /etiket/{etiketurl} şeklinde yeniden yapılandırıp çalışır hale getirelim. Daha sonra google ‘ın indexlediği yani arama sonuçlarında çıkan url yapısını yeni yapımıza yönlendirmemiz gerekiyor. Bunun için Global.asax dosyasını açıp eski url yapımızı yakalayıp bir Action da bunu 301 Redirect yönlendirmesi yaparak yeni url yapısına yönlendireceğiz.

routes.MapRoute(null,
“etiket/{tagName}”,
new { controller = “Home”, action = “Tags” }
);

routes.MapRoute(null,
“etiket/{tagName}/{id}”,
new { controller = “Home”, action = “TagsResolve” },
new { id = @“\d+” }
);

Yukarıda gördüğümüz route tanımlamalarında üstteki çalışmasını istediğimiz yeni yapı. Alttaki iste google sonuçlarında çıkan eski indexlerimizi yakalayıp TagResolve Action’ında yeni yapıya yönlendirme işlemi yapacağımızı belirttik. Şimdi TagResolve Action’ında nasıl 301 yönlendirmesi yapacağımıza bakalım.

301 Yönlendirmesi (301 Redirect) :

public ActionResult TagsResolve(int id)
{
string url = “/etiket/”;
url += db.Tags.Where(l => l.TagId == id).Single().Url;
Response.StatusCode = 301;
Response.RedirectLocation = url;
return new ContentResult();
}

Bu Action’ımız eski url yapısında gelen ziyaretçimizi yakalayıp yeni url yapımıza 301 Redirect yani 301 Yönlendirmesi yaparak google için yada sitenin sıralaması için endişelenmemize son veriyor.

Jquery JqGrid’ten Excel’e veri Aktarma

Bu makalemizde Jquery kütüphanesinin JqGrid plug-in ni kullanarak verileri göstermeyi ve bu verileri excel e aktarmayı göreceğiz. JqGrid size verilerinizi sıralama, sayfalama, arama gibi işlemleri kolayca yapmanızı sağlıyor.

Uygulamamızı Asp.Net MVC 1.0 da geliştireceğiz. Öncelikle JQuery ve JGrid kütüphanelerini indirmeliyiz.

JqGrid i sayfamıza yerleştirelim

Ürünleri database’den çekmeden önce sayfamızdan gerekli script lere referans verdiğimizden emin olmalıyız. Master Page te bütün CSS ve JS leri çağırmalıyız.

 <link href="../../Content/Site.css" rel="stylesheet" type="text/css" />  
    <link href="../../Content/ui.jqgrid.css" rel="stylesheet" type="text/css" />  
    <script src="../Scripts/jquery-1.3.2.js" type="text/javascript"></script>  
    <script src="../Scripts/jquery.jqGrid.js" type="text/javascript"></script>  
    <script src="../../Scripts/Site.js" type="text/javascript"></script>  

Bu işlemleri tamamladıktan sonra örnek olarak Northwind database “Products” table ı kullanarak repository i oluşturalım.

 public class ProductRepository : IProductRepository
    {
        public List<Product> GetAll()
        {
            using(var db = new NorthwindDataContext())
            {
                return (from p in db.Products
                       select p).ToList();
            }
        }
    }

loadProduct fonksiyonu View yani sayfamız load olduğunda verileri çağıracak.

<script language="javascript" type="text/javascript">

    // load the products
    loadProducts(); 

</script>  

<% using (Html.BeginForm(new { Action = "ExportToExcel" }))
 {%>

<table id="list"></table>

<input type="submit" value="Excel e aktar" />

<%

 }%>

Şimdi loadProduct methodumuza bakalım.

function loadProducts()
{
    jQuery(document).ready(function() {
        jQuery("#list").jqGrid({
            url: '/Home/GetProducts/',
            datatype: 'json',
            mtype: 'GET',
            colNames: ['Id', 'Name', 'QuantityPerUnit',"UnitPrice"],
            colModel: [
          { name: 'Id', index: 'Id', width: 40, align: 'left' },
          { name: 'Name', index: 'Name', width: 40, align: 'left' },
          { name: 'QuantityPerUnit', index: 'QuantityPerUnit', width: 200, align: 'left' },
          { name: 'UnitPrice', index: 'UnitPrice', width: 200, align: 'left' }],
            rowNum: 10,
            rowList: [5, 10, 20, 50],
            sortname: 'Id',
            sortorder: "desc",
            viewrecords: true,
            caption: 'My first grid'
        });
    });
}

Şimdi de Controller ımızdaki kodu hazırlayalım.

 public ActionResult GetProducts(string sidx, string sord, int page, int rows)
        {
  var products = _productRepository.GetAll();

            var totalPages = 1; // we'll implement later
            var totalRecords = 3; // implement later

            var jsonData = new
                               {
                                   total = totalPages,
                                   page = page,
                                   records = totalRecords,
                                   rows = (from p in products
                                           select new
                                                      {
                                                          id = p.ProductID,
                                                          cell = new string[]
                                                                     {
                                                                         p.ProductID.ToString(), p.ProductName,
                                                                         p.ProductName
                                                                     }
                                                      }).ToArray()
                               };

            return Json(jsonData);
}

_productRepository.GetAll() methodu Product Tablosundaki verileri çekmemizi sağladı. Son olarak JqGrid için gerekli olan properties leri bulunduran jsonData adındaki Anonymous type değişkenimizi oluşturduk.

Projemizi çalıştırdığımızda aşağıdaki görüntüyü elde edeceğiz.

ToJsonForjqGrid<T> Extension Method u Oluşturmak:

ToJsonForjqGrid<T> extension ı jqGrid in desteklediği List<T> collection a çevirmek zorundayız.
  public static object ToJsonForjqGrid<T>(this List<T> list,string primaryKey,string[] columnNames) where T : new()
        {
            if(list.Count() == 0)
                throw new ArgumentException("List does not contain any items!");

            var jsonData = new
                               {

                                   rows = (from p in list
                                          select new
                                        {
                                            id = p.GetPropertyValue(primaryKey),
                                            cell = p.GetPropertyValues(columnNames)       
                                        }).ToArray()                               

                               };

            return jsonData; 
        }

ToJsonForJqGrid<T> iki parametre alıyor. Birincisi primarykey yani row daki property nin id’si. İkincisi ise columnNames[] griddeki kolonların isimleri.

Şimdi GetProducts ı ToJsonForJqGrid i kullanarak değiştirelim.

 public ActionResult GetProducts(string sidx, string sord, int page, int rows)
        {

            var jsonData = _productRepository.GetAll().ToJsonForjqGrid("ProductID", new[] { "ProductID", "ProductName" });
            return Json(jsonData);

        }

Eğer daha fazla kolon göstermek istersek columnName e bir kaç alan daha eklememiz yeterli.

...ToJsonForjqGrid("ProductID", new[] { "ProductID", "ProductName", "QuantityPerUnit","UnitPrice" });

Grid i Excele Aktarma

Excel e Aktar butonu tıklandığında ExportToExcel action ı tetiklenecek.

 public ActionResult ExportToExcel()
        {
            var products = _productRepository.GetAll();

            var grid = new GridView();
            grid.DataSource = from p in products
                              select new
                                         {
                                             ProductName = p.ProductName,
                                             SomeProductId = p.ProductID
                                         };
            grid.DataBind();

            Response.ClearContent();
            Response.AddHeader("content-disposition", "attachment; filename=MyExcelFile.xls");

            Response.ContentType = "application/excel";

            StringWriter sw = new StringWriter();

            HtmlTextWriter htw = new HtmlTextWriter(sw);

            grid.RenderControl(htw);

            Response.Write(sw.ToString());

            Response.End();

            return View("Index");
        }

Herkese iyi çalışmalar..

URL Rewrite ‘ta Resim Ve Link Hatası Asp.net MVC

URL Rewrite’da resimlere yol verirken “src=” in başına “/” koymuyoruz ve <a> tagına “href=” yazarken de tam aksine “/” koymak zorundayız çok dikkat etmeniz gereken bir nokta. URL Rewrite uyguladığınız projede resimleriniz gözükmüyor ise yada yazdığınız “href=” linki açılmayıp adresin sonuna ekleniyorsa yapacağınız işlem aşağıda belirtilmiştir.
(more…)

Ü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…)

« Yeni YazılarEski Yazılar »