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);
        }
 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;
 }
 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;
 }