// GET: Agentes/Edit/5
        public ActionResult Edit(int?id)
        {
            if (id == null)
            {
                // return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
                return(RedirectToAction("Index"));
            }

            Agentes agentes = db.Agentes.Find(id);

            if (agentes == null)
            {
                //return HttpNotFound();
                return(RedirectToAction("Index"));
            }

            var model = new EditAgenteViewModel
            {
                ID              = agentes.ID,
                Esquadra        = agentes.Esquadra,
                FotografiaAtual = agentes.Fotografia
            };

            return(View(model));
        }
        public ActionResult Edit(EditAgenteViewModel model)
        {
            if (!ModelState.IsValid)
            {
                return(View(model));
            }

            // Obter o agente a editar, e produzir um erro se não existir.
            var agente = db.Agentes.Find(model.ID);

            if (agente == null)
            {
                ModelState.AddModelError("", "O agente não existe.");

                return(View(model));
            }

            /// como se pretende editar os dados de um Agente,
            /// tem de haver a hipótese de se editar a fotografia dele.
            /// Por esse motivo, é necessário adicionar aos parâmetros de entrada do método
            /// uma variável do tipo HttpPostedFileBase para receber o ficheiro da imagem.
            /// É igualmente necessário adicionar, na View, um objeto do tipo <input type="file" />
            /// para possibilitar a escolha da imagem a efetuar upload.
            /// O nome da variável no método do controller e na view tem de ser o mesmo.
            ///
            /// De igual forma, é necessário alterar a forma como se configura o objeto do tipo <form />,
            /// responsável por enviar os dados do browser para o servidor,
            /// adicionando-lhe o parâmetro 'enctype = "multipart/form-data" '

            /// quando se faz uma simples substituição de uma fotografia por outra,
            /// mantendo o nome original, nem sempre os browsers atualizam, no ecrã,
            /// a nova imagem, pela forma como fazem a gestão da 'cache'.
            /// Por isso, é frequente alterar-se o nome da nova imagem, adicionando-lhe um termo
            /// associado à data+hora da alteração.

            // vars. auxiliares
            string novoNome   = "";
            string nomeAntigo = "";

            if (ModelState.IsValid)
            {
                try
                {              /// se foi fornecida uma nova imagem,
                               /// preparam-se os dados para efetuar a alteração
                    if (model.Fotografia != null)
                    {
                        /// antes de se fazer alguma coisa, preserva-se o nome antigo da imagem,
                        /// para depois a remover do disco rígido do servidor
                        nomeAntigo = agente.Fotografia;
                        /// para o novo nome do ficheiro, vamos adicionar o termo gerado pelo timestamp
                        /// devidamente formatado, mais
                        /// A extensão do ficheiro é obtida automaticamente em vez de ser escrita de forma explícita
                        novoNome = "Agente_" + agente.ID + DateTime.Now.ToString("_yyyyMMdd_hhmmss") + Path.GetExtension(model.Fotografia.FileName).ToLower();;
                        /// atualizar os dados do Agente com o novo nome
                        agente.Fotografia = novoNome;
                        /// guardar a nova imagem no disco rígido
                        model.Fotografia.SaveAs(Path.Combine(Server.MapPath("~/imagens/"), novoNome));
                    }

                    // Passar os dados do modelo para o agente
                    agente.Esquadra = model.Esquadra;

                    // guardar os dados do Agente
                    db.Entry(agente).State = EntityState.Modified;
                    // Commit
                    db.SaveChanges();

                    /// caso tenha sido fornecida uma nova imagem há necessidade de remover
                    /// a antiga
                    if (model.Fotografia != null)
                    {
                        System.IO.File.Delete(Path.Combine(Server.MapPath("~/imagens/"), nomeAntigo));
                    }

                    // enviar os dados para a página inicial
                    return(RedirectToAction("Index"));
                }
                catch (Exception)
                {
                    // caso haja um erro deve ser enviada uma mensagem para o utilizador
                    ModelState.AddModelError("", string.Format("Ocorreu um erro com a edição dos dados do agente {0}", agente.Nome));
                }
            }

            // Preencher novamente os campos que se possam ter perdido...
            model.FotografiaAtual = agente.Fotografia;

            return(View(model));
        }