public ActionResult Index(int?page, int?size, ListFilterVM filter = null)
        {
            int pageNumber = 1;
            int pageSize   = 5;

            if (page.HasValue)
            {
                pageNumber = page.Value;
            }

            if (size.HasValue)
            {
                pageSize = size.Value;
            }

            var customerList = customerService.GetCustomers();

            if (filter != null)
            {
                customerList = customerService.ApplyFilters(customerList, filter);
            }

            int totalRowCount = customerList.Count();
            int itemstoSkip   = pageSize * (pageNumber - 1);

            customerList = customerList.Skip(itemstoSkip).Take(pageSize).ToList();

            var customerListVM = new CustomerListViewModel {
                Customers = customerList
            };

            ApplyPagingInformation(pageNumber, pageSize, customerListVM.PagingDetails, totalRowCount);

            if (Request.IsAjaxRequest())
            {
                // If it is an ajax request ( from Sorting/Filtering event or by clicking on a page number), send the response in JSON format
                var pagingMarkup = RenderPartialView("TablePagingFooter", customerListVM.PagingDetails, new ViewDataDictionary {
                    { "baseurl", Url.Action("Index", "Home") + "?c" }
                });
                return(Json(new { ListingMarkup = RenderPartialView("Partial/Index", customerListVM), PagingMarkup = pagingMarkup }, JsonRequestBehavior.AllowGet));
            }
            return(View(customerListVM));
        }
 private List <Customer> SortClientList(List <Customer> clientList, ListFilterVM filter)
 {
     //Let's sort first and then filter
     if (!String.IsNullOrEmpty(filter.SortColumnName))
     {
         if (filter.SortColumnName.ToUpper() == "FIRSTNAME")
         {
             if (!String.IsNullOrEmpty(filter.SortType) && filter.SortType.ToUpper() == "DESC")
             {
                 clientList = clientList.OrderByDescending(s => s.FirstName).ToList();
             }
             else
             {
                 clientList = clientList.OrderBy(s => s.FirstName).ToList();
             }
         }
         else if (filter.SortColumnName.ToUpper() == "CITY")
         {
             if (!String.IsNullOrEmpty(filter.SortType) && filter.SortType.ToUpper() == "DESC")
             {
                 clientList = clientList.OrderByDescending(s => s.City).ToList();
             }
             else
             {
                 clientList = clientList.OrderBy(s => s.City).ToList();
             }
         }
         else if (filter.SortColumnName.ToUpper() == "REGISTRATIONDATE")
         {
             if (!String.IsNullOrEmpty(filter.SortType) && filter.SortType.ToUpper() == "DESC")
             {
                 clientList = clientList.OrderByDescending(s => s.RegistrationDate).ToList();
             }
             else
             {
                 clientList = clientList.OrderBy(s => s.RegistrationDate).ToList();
             }
         }
     }
     return(clientList);
 }
 public List <Customer> ApplyFilters(List <Customer> clientList, ListFilterVM search)
 {
     // If the last event was SEARCH (That means first event was Sort), Let's sort the results first before it the search criteria runs on it.
     if ((!String.IsNullOrEmpty(search.LastEvent) && (search.LastEvent.ToUpper() == "FILTER")))
     {
         clientList = SortClientList(clientList, search);
     }
     if (search.Filters != null)
     {
         foreach (var filter in search.Filters)
         {
             clientList = FilterWithName(clientList, filter).ToList();
             clientList = FilterWithCity(clientList, filter).ToList();
             clientList = FilterWithRegistrationDate(clientList, filter).ToList();
         }
     }
     if ((!String.IsNullOrEmpty(search.LastEvent)) && (search.LastEvent.ToUpper() == "SORT"))
     {
         // If the last event was SORT (That means first event was Sort), Let's sort the results now
         clientList = SortClientList(clientList, search);
     }
     return(clientList);
 }