﻿
{"id":3289,"date":"2015-09-21T09:34:36","date_gmt":"2015-09-21T09:34:36","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=3289"},"modified":"2015-09-21T09:36:03","modified_gmt":"2015-09-21T09:36:03","slug":"asp-net-mvcde-ajax-uzerinden-sayfalama-yapimi-ve-filtreleme-islemleri","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/asp-net-mvcde-ajax-uzerinden-sayfalama-yapimi-ve-filtreleme-islemleri\/","title":{"rendered":"Asp.NET MVC&#8217;de Ajax \u00dczerinden Sayfalama Yap\u0131m\u0131 ve Filtreleme \u0130\u015flemleri"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Bir \u00f6nceki yazm\u0131\u015f oldu\u011fum <a href=\"http:\/\/www.gencayyildiz.com\/blog\/asp-net-mvcde-pagedlist-kullanarak-verileri-sayfalama\/\" target=\"_blank\">Asp.NET MVC\u2019de PagedList Kullanarak Verileri Sayfalama<\/a> ba\u015fl\u0131kl\u0131 yaz\u0131mda Asp.NET MVC&#8217;de PagedList ile sayfalama yap\u0131m\u0131n\u0131 detayl\u0131ca irdelemi\u015ftik.Bu yaz\u0131m\u0131zda ise h\u0131zl\u0131 bir \u015fekilde PagedList ile sayfalama yap\u0131lm\u0131\u015f bir veri k\u00fcmesinde Ajax ile filtreleme i\u015flemlerine de\u011finece\u011fiz.<\/p>\n<p>Bu yaz\u0131m\u0131zdaki \u00f6rneklendirmeyide \u00f6nceki yaz\u0131m\u0131zda oldu\u011fu gibi Northwind veritaban\u0131ndaki M\u00fc\u015fteriler tablosu \u00fczerinden ger\u00e7ekle\u015ftirece\u011fiz.<\/p>\n<p>Olu\u015fturdu\u011fumuz bo\u015f bir Asp.NET MVC mimarisine gerekli PagedList Componenti ve JQuery ve Ajax k\u00fct\u00fcphanelerini entegre ettikten sonra(ki bu i\u015flemler i\u00e7in yukar\u0131da vermi\u015f oldu\u011fum adresteki yaz\u0131y\u0131 inceleyiniz) Models katman\u0131m\u0131zda ilgili veritaban\u0131n\u0131n Linq To Sql ile entegresini ger\u00e7ekle\u015ftirelim.Bu yaz\u0131m\u0131zda yukar\u0131da vermi\u015f oldu\u011fum adresteki proje kodlar\u0131n\u0131 temel alaca\u011f\u0131m\u0131z i\u00e7in \u00f6rne\u011fimizin PagedList entegrasyonunda \u00e7ok fazla teferruata girmeyece\u011fim.<br \/>\n\u015eimdi &#8220;Home(Controller).cs&#8221; isimli bir Controller olu\u015ftural\u0131m ve &#8220;Index&#8221; isimli Action metodunun View katman\u0131ndaki .cshtml uzant\u0131l\u0131 dosyas\u0131nda a\u015fa\u011f\u0131daki yap\u0131y\u0131 olu\u015ftural\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n@using PagedList\r\n@using PagedList.Mvc\r\n@using PagedListExample.Models\r\n@model Musteriler\r\n\r\n&lt;h2&gt;M\u00fc\u015fteriler&lt;\/h2&gt;\r\n\r\n&lt;div id=&quot;dvMusteriFiltre&quot;&gt;\r\n    &lt;input type=&quot;text&quot; value=&quot;\u015eirket Ad\u0131&quot; id=&quot;txtSirketAdi&quot; name=&quot;txtSirketAdi&quot; \/&gt;\r\n    &lt;input type=&quot;text&quot; value=&quot;M\u00fc\u015fteri Ad\u0131&quot; id=&quot;txtMusteriAdi&quot; name=&quot;txtMusteriAdi&quot; \/&gt;\r\n    &lt;input type=&quot;text&quot; value=&quot;\u015eehir&quot; id=&quot;txtSehir&quot; name=&quot;txtSehir&quot; \/&gt;\r\n    &lt;input type=&quot;submit&quot; value=&quot;Ara&quot; id=&quot;btnAra&quot; \/&gt;\r\n&lt;\/div&gt;\r\n&lt;div id=&quot;dvMusteriListesi&quot;&gt;\r\n    @Html.Partial(&quot;~\/Views\/Home\/_MusteriListesi.cshtml&quot;, Model)\r\n&lt;\/div&gt;\r\n<\/pre>\n<p>Bu olu\u015fturdu\u011fumuz yap\u0131da hem &#8220;_MusteriListesi.cshtml&#8221; i\u00e7inde PagedList ile sayfalama yaparken, bir yandan da dinamik filtrelemeyi olu\u015fturaca\u011f\u0131z.Tabi burada filtrelemeyi yaparken Ajax&#8217;tan yararlanaca\u011f\u0131z lakin oturup Ajax yazmadan, Ajax.BeginForm yard\u0131m\u0131yla bu i\u015flemi g\u00f6rece\u011fiz.Yaz\u0131m\u0131z\u0131n ilerideki ad\u0131mlar\u0131nda bu alan\u0131 d\u00fczeltece\u011fiz.<\/p>\n<p>\u015eimdi &#8220;_MusteriListesi.cshtml&#8221; Partial&#8217;\u0131n\u0131 d\u00fczenlemeden Modelimizdeki Musteriler Entity&#8217;sine bir ka\u00e7 ekleme ger\u00e7ekle\u015ftirece\u011fiz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    partial class Musteriler\r\n    {\r\n        public int? SayfaNumarasi { get; set; }\r\n        public IPagedList&lt;Musteriler&gt; MusteriListesi { get; set; }\r\n    }\r\n<\/pre>\n<p>Bu propertylerin eklenmesinin sebebi, filtreleme esnas\u0131nda verileri bir Musteriler modeli olarak Action&#8217;a post ettikten sonra PagedList&#8217;in SayfaNumarasi&#8217;ni tutacak veriyi ve PagedList&#8217;e veri kayna\u011f\u0131 olacak koleksiyonu bar\u0131nd\u0131rmas\u0131 i\u00e7in bu eklemeleri yapt\u0131m.<\/p>\n<p>\u015eimdi &#8220;_MusteriListesi.cshtml&#8221; Partial&#8217;\u0131n\u0131 a\u015fa\u011f\u0131daki gibi olu\u015ftural\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n@using PagedList\r\n@using PagedList.Mvc\r\n@using PagedListExample.Models\r\n@model Musteriler\r\n\r\n&lt;table&gt;\r\n    &lt;thead&gt;\r\n        &lt;tr&gt;\r\n            &lt;th&gt;\u015eirket Ad\u0131&lt;\/th&gt;\r\n            &lt;th&gt;M\u00fc\u015fteri Ad\u0131&lt;\/th&gt;\r\n            &lt;th&gt;\u015eehir&lt;\/th&gt;\r\n        &lt;\/tr&gt;\r\n    &lt;\/thead&gt;\r\n    &lt;tbody&gt;\r\n        @foreach (var Musteri in Model.MusteriListesi)\r\n            {\r\n            &lt;tr&gt;\r\n                &lt;td&gt;@Musteri.SirketAdi&lt;\/td&gt;\r\n                &lt;td&gt;@Musteri.MusteriAdi&lt;\/td&gt;\r\n                &lt;td&gt;@Musteri.Sehir&lt;\/td&gt;\r\n            &lt;\/tr&gt;\r\n        }\r\n    &lt;\/tbody&gt;\r\n&lt;\/table&gt;\r\n\r\n@Html.PagedListPager(Model.MusteriListesi, _sayfaNo =&gt;\r\nUrl.Action(&quot;Index&quot;, &quot;Home&quot;, new RouteValueDictionary\r\n{\r\n    {&quot;SirketAdi&quot;, Model.SirketAdi },\r\n    {&quot;MusteriAdi&quot;, Model.MusteriAdi },\r\n    {&quot;Sehir&quot;, Model.Sehir },\r\n    {&quot;SayfaNumarasi&quot;, _sayfaNo }\r\n}), PagedListRenderOptions.EnableUnobtrusiveAjaxReplacing(new AjaxOptions { UpdateTargetId = &quot;dvMusteriListesi&quot; }))\r\n<\/pre>\n<p>Partial sayesinde listelememizi ger\u00e7ekle\u015ftirmi\u015f olduk.Dikkat ederseniz e\u011fer new RouteValueDictionary nesnesi ile g\u00f6nderilecek modelin property isimleri yaz\u0131l\u0131p, kar\u015f\u0131lar\u0131na de\u011ferleri girilmektedir.Neticede bu \u015fekilde her talep do\u011frultusunda bu property isimlerine ilgili de\u011ferler y\u00fcklenip post edilecek ve server taraf\u0131nda bu post neticesinde biz gelen datay\u0131 model olarak yakalayabilece\u011fiz.Verilen property isimleriyle uyumluluk g\u00f6sterdi\u011fi i\u00e7in gelen veriyi Musteri modeli olarak yakalayaca\u011f\u0131z.\u015eimdi ilgili &#8220;Home(Controller).cs&#8221; isimli Controller katman\u0131m\u0131zda ki &#8220;Index&#8221; Action metodunu a\u015fa\u011f\u0131daki gibi olu\u015ftural\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class HomeController : Controller\r\n    {\r\n        VeriTabaniDataContext Veri = new VeriTabaniDataContext();\r\n        public ActionResult Index(Musteriler Musteri)\r\n        {\r\n            int _sayfaNo = Musteri.SayfaNumarasi ?? 1;\r\n            Musteri.MusteriListesi = Veri.Musterilers.Where(\r\n                m =&gt; (String.IsNullOrEmpty(Musteri.SirketAdi) || m.SirketAdi.Contains(Musteri.SirketAdi)) &amp;&amp;\r\n                (String.IsNullOrEmpty(Musteri.MusteriAdi) || m.MusteriAdi.Contains(Musteri.MusteriAdi)) &amp;&amp;\r\n                (String.IsNullOrEmpty(Musteri.Sehir) || m.Sehir.Contains(Musteri.Sehir))\r\n                ).OrderByDescending(m =&gt; m.MusteriID).ToPagedList&lt;Musteriler&gt;(_sayfaNo, 10);\r\n\r\n            if (Request.IsAjaxRequest())\r\n            {\r\n                return PartialView(&quot;~\/Views\/Home\/_MusteriListesi.cshtml&quot;, Musteri);\r\n            }\r\n\r\n            return View(Musteri);\r\n        }\r\n    }\r\n<\/pre>\n<p>Evet, yukar\u0131daki kod blo\u011funu incelerseniz e\u011fer dinamik Where sorgusu in\u015faa ettik ve filtreleme kriterlerine g\u00f6re verilerimizi \u00e7ektirdik.Bu algoritmay\u0131 iyi okursan\u0131z e\u011fer sayfa ilk a\u00e7\u0131l\u0131yorsa t\u00fcm verileri getirece\u011fini g\u00f6receksinizdir.<\/p>\n<p>\u015eimdi son olarak &#8220;Index.cshtml&#8221; sayfam\u0131zda Ajax formunu olu\u015fturmak i\u00e7in yeniden buraya alal\u0131m ve g\u00fcncelleyelim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n@using PagedList\r\n@using PagedList.Mvc\r\n@using PagedListExample.Models\r\n@model Musteriler\r\n\r\n&lt;h2&gt;M\u00fc\u015fteriler&lt;\/h2&gt;\r\n\r\n&lt;div id=&quot;dvMusteriFiltre&quot;&gt;\r\n    @using (Ajax.BeginForm(&quot;Index&quot;,&quot;Home&quot;,FormMethod.Post, new AjaxOptions { OnSuccess = &quot;jsFiltreleme&quot; }))\r\n    {\r\n        &lt;strong&gt;\u015eirket Ad\u0131&lt;\/strong&gt;@Html.TextBoxFor(model =&gt; model.SirketAdi)\r\n        &lt;strong&gt;M\u00fc\u015fteri Ad\u0131&lt;\/strong&gt;@Html.TextBoxFor(model =&gt; model.MusteriAdi)\r\n        &lt;strong&gt;\u015eehir&lt;\/strong&gt;@Html.TextBoxFor(model =&gt; model.Sehir)\r\n        &lt;input type=&quot;submit&quot; value=&quot;Ara&quot; id=&quot;btnAra&quot; \/&gt;\r\n    }\r\n&lt;\/div&gt;\r\n&lt;div id=&quot;dvMusteriListesi&quot;&gt;\r\n    @Html.Partial(&quot;~\/Views\/Home\/_MusteriListesi.cshtml&quot;, Model)\r\n&lt;\/div&gt;\r\n<\/pre>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi filtreleme yapaca\u011f\u0131m\u0131z\u0131 alan\u0131 Ajax.BeginForm ile yap\u0131land\u0131rm\u0131\u015f olduk.Burada dikkat etmeniz gerkeen husus AjaxOptions nesnesinde OnSuccess propertysine vermi\u015f oldu\u011fumuz &#8220;jsFiltreleme&#8221; de\u011feridir.Bu nedir diye sorarsan\u0131z \u015f\u00f6yle izah edeyim.Filtreleme ama\u00e7l\u0131 de\u011ferler post edildi\u011fi zaman Ajax ile i\u015flenecektir ve e\u011fer serverda yap\u0131lan i\u015flemler neticesinde geriye bir de\u011fer d\u00f6n\u00fcl\u00fcyorsa OnSuccess propertysinde ismi verilen JavaScript fonksiyonu \u00e7al\u0131\u015ft\u0131r\u0131lacakt\u0131r.Yani geriye d\u00f6n\u00fclen de\u011feri biz &#8220;jsFiltreleme&#8221; fonksiyonunda yakalayabilece\u011fiz.Tabi birazdan bu fonksiyonu olu\u015fturaca\u011f\u0131z.\u015eunu demeden ge\u00e7emeyece\u011fim ki, OnSuccess \u00f6zelli\u011fi, Ajax komutlar\u0131ndaki success fonksiyonuyla birebir mant\u0131kt\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n&lt;script type=&quot;text\/javascript&quot;&gt;\r\n    function jsFiltreleme(GelenDeger)\r\n    {\r\n        $(&quot;#dvMusteriListesi&quot;).html(GelenDeger);\r\n    }\r\n&lt;\/script&gt;\r\n<\/pre>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi son olarakta JavaScript fonksiyonumuzu olu\u015fturmu\u015f oluyoruz.Nihayetinde Ajax ile post i\u015flemi neticesinde geriye bir PartialView d\u00f6n\u00fclecektir.\u0130\u015fte bu PartialView de\u011ferini GelenDeger parametresiyle yakalay\u0131p, ilgili div i\u00e7ine tekrardan bast\u0131r\u0131yoruz ve PagedList&#8217;te hem sayfalamada hem de filtrelemede dinamik yap\u0131lar\u0131 kullanm\u0131\u015f oluyoruz.<\/p>\n<p>Projemizi derleyip \u00e7al\u0131\u015ft\u0131ral\u0131m ve a\u015fa\u011f\u0131daki videoda da oldu\u011fu gibi gayet esnek, g\u00fczel ve ho\u015f bir yap\u0131yla kar\u015f\u0131la\u015fal\u0131m.<\/p>\n<p><iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"https:\/\/www.youtube-nocookie.com\/embed\/HizRR_mvWaA\" frameborder=\"0\" allowfullscreen><\/iframe><\/p>\n<p>Sonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar dilerim&#8230;<\/p>\n<p>Kaynak : https:\/\/www.youtube.com\/watch?v=0opJw6w8mmY<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Bir \u00f6nceki yazm\u0131\u015f oldu\u011fum Asp.NET MVC\u2019de PagedList Kullanarak Verileri Sayfalama ba\u015fl\u0131kl\u0131 yaz\u0131mda Asp.NET MVC&#8217;de PagedList ile sayfalama yap\u0131m\u0131n\u0131 detayl\u0131ca irdelemi\u015ftik.Bu yaz\u0131m\u0131zda ise h\u0131zl\u0131 bir \u015fekilde PagedList ile sayfalama yap\u0131lm\u0131\u015f bir veri k\u00fcmesinde Ajax ile&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":3014,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9,11,600,19,780],"tags":[793,746,732,283,794,786,795],"class_list":["post-3289","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ajax","category-asp-net-mvc","category-asp-net-mvc-5","category-jquery","category-json","tag-ajax-beginform","tag-asp-net-mvc","tag-filtreleme","tag-mvc","tag-onsuccess","tag-pagedlist","tag-veri-sayfalama"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/3289","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=3289"}],"version-history":[{"count":0,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/3289\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/3014"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=3289"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=3289"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=3289"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}