public async Task <IActionResult> Index()
        {
            // Fornecer feedback ao cliente caso este exista.
            // Este feedback é fornecido na view a partir de uma notificação 'Noty'
            if (TempData["Feedback"] != null)
            {
                ViewData["Feedback"] = TempData["Feedback"];
                ViewData["Type"]     = TempData["Type"] ?? "success";
            }

            // Recolher os partilhaveis por página do cookie
            int partPP = CookieAPI.GetAsInt32(Request, "PartilhaveisPerPage") ?? _partPP;

            var partilhaveis = _context.Partilhaveis.Include(p => p.Servico).OrderByDescending(p => p.DataDeCriacao);

            PartilhavelIndexViewModel response = new PartilhavelIndexViewModel
            {
                Partilhaveis = await partilhaveis.Take(partPP).ToListAsync(),
                FirstPage    = true,
                LastPage     = (partilhaveis.Count() <= partPP),
                PageNum      = 1
            };

            ViewData["partPP"] = partPP;

            return(View(response));
        }
        public async Task <IActionResult> IndexFilter([Bind("NomeSearch,ServicoId,Validade,Ordem,Page,PartilhaveisPerPage")] PartilhavelSearchViewModel search)

        {
            int skipNum = (search.Page - 1) * search.PartilhaveisPerPage;

            // Recolher os partilhaveis por página do cookie
            int partPP = CookieAPI.GetAsInt32(Request, "PartilhaveisPerPage") ?? _partPP;

            // Caso o utilizador tenha alterado os partilhaveis por página, alterar a variável e guardar
            // o novo  valor no cookie
            if (search.PartilhaveisPerPage != partPP)
            {
                partPP = search.PartilhaveisPerPage;
                CookieAPI.Set(Response, "PartilhaveisPerPage", partPP.ToString());
            }

            // Query de todos os serviços
            IQueryable <Partilhavel> partilhaveis = _context.Partilhaveis;

            // Caso exista pesquisa por nome
            if (!String.IsNullOrEmpty(search.NomeSearch))
            {
                partilhaveis = partilhaveis.Where(p => p.Nome.Contains(search.NomeSearch));
            }
            // Caso exista pesquisa por servicço
            if (!String.IsNullOrEmpty(search.ServicoId))
            {
                partilhaveis = partilhaveis.Where(p => p.ServicoFK.Equals(search.ServicoId));
            }

            switch (search.Validade)
            {
            case "valido":
                partilhaveis = partilhaveis.Where(p => p.Validade == null || DateTime.Compare((DateTime)p.Validade, DateTime.Now) > 0);
                break;

            case "expirado":
                partilhaveis = partilhaveis.Where(p => p.Validade != null && DateTime.Compare((DateTime)p.Validade, DateTime.Now) < 0);
                break;

            default:
                break;
            }

            switch (search.Ordem)
            {
            case "nome":
                partilhaveis = partilhaveis.OrderBy(p => p.Nome);
                break;

            default:
                partilhaveis = partilhaveis.OrderByDescending(p => p.DataDeCriacao);
                break;
            }

            partilhaveis = partilhaveis.Include(p => p.Servico).Skip(skipNum);

            PartilhavelIndexViewModel response = new PartilhavelIndexViewModel
            {
                Partilhaveis = await partilhaveis.Take(partPP).ToListAsync(),
                FirstPage    = (search.Page == 1),
                LastPage     = (partilhaveis.Count() <= partPP),
                PageNum      = search.Page
            };

            return(PartialView("PartialViews/_IndexCards", response));
        }