public async Task <ActionResult> Edit(Categoria categoria)
        {
            if (ModelState.IsValid)
            {
                db.Entry(categoria).State = EntityState.Modified;
                await db.SaveChangesAsync();

                // INICIO - Guarda los campos adicionales
                List <CampoValor> campos = HttpContext.Session.GetComplex <List <CampoValor> >("Campos");
                foreach (CampoValor campon in campos)
                {
                    var valor = HttpContext.Request.Form[campon.Campo.Nombre].ToString();
                    if (campon.Valor != null)
                    {
                        ValorCampo valoredit = await db.ValorCampo.FindAsync(campon.Valor.Id);

                        valoredit.Texto = valor;
                        // db.Entry(original).State = EntityState.Detached;
                        db.Entry(valoredit).State = EntityState.Modified;
                        await db.SaveChangesAsync();
                    }
                    else
                    {
                        ValorCampo valoradd = new ValorCampo();
                        valoradd.IdCampo        = campon.Campo.Id;
                        valoradd.CategoriaPadre = categoria;
                        valoradd.Texto          = valor;
                        await db.ValorCampo.AddAsync(valoradd);

                        await db.SaveChangesAsync();
                    }
                }
                HttpContext.Session.Remove("Campos");
                // FIN - almacenar campos adicionales
                return(RedirectToAction("Index"));
            }

            List <SelectListItem> CategoriaLista = new List <SelectListItem>();
            var CategoriaListadb = await db.Categoria.Where(n => n.id != categoria.id).ToListAsync();

            foreach (var itemn in CategoriaListadb)
            {
                CategoriaLista.Add(new SelectListItem()
                {
                    Text = itemn.numero + " " + itemn.nombre, Value = itemn.id.ToString()
                });
            }
            ViewBag.Categorias   = new SelectList(CategoriaLista, "Value", "Text", categoria.idCategoria);
            ViewBag.Responsables = new SelectList(await db.Responsable.ToListAsync(), "Id", "Nombre", categoria.IdResponsable);
            ViewBag.Niveles      = new SelectList(await db.Nivel.ToListAsync(), "id", "nombre", categoria.idNivel);

            //regenerar campos adicionales en viewbag
            ViewBag.Campos = HttpContext.Session.GetComplex <List <CampoValor> >("Campos");

            return(View(categoria));
        }
        public void CambioModelo(string Modelo, string Accion, object ContenidoNew, string usuario)
        {
            if (1 == 1)
            {
                string newModelString = "";
                string oldModelString = "";

                switch (Modelo)
                {
                case "Ejecucion":
                    Ejecucion newModel = (Ejecucion)ContenidoNew;
                    newModelString = new JavaScriptSerializer().Serialize(newModel);
                    if (newModel.id != 0)
                    {
                        Ejecucion oldModel = db.Ejecucion.Where(n => n.id == newModel.id).FirstOrDefault();
                        oldModelString = new JavaScriptSerializer().Serialize(new { id = oldModel.id, idindicador = oldModel.idindicador, idperiodo = oldModel.idperiodo, planeado = oldModel.planeado, ejecutado = oldModel.ejecutado, cargado = oldModel.cargado, Nota = oldModel.Nota, adjunto = oldModel.adjunto });
                    }
                    break;

                case "Indicador":
                    Indicador newModel2 = (Indicador)ContenidoNew;
                    newModelString = new JavaScriptSerializer().Serialize(newModel2);
                    if (newModel2.id != 0)
                    {
                        Indicador oldModel2 = db.Indicador.Find(newModel2.id);
                        oldModelString = new JavaScriptSerializer().Serialize(new { id = oldModel2.id, idCategoria = oldModel2.idCategoria, ponderador = oldModel2.ponderador, tipo = oldModel2.tipo, TipoIndicador = oldModel2.TipoIndicador, codigo = oldModel2.codigo, unidad = oldModel2.unidad, nombre = oldModel2.nombre, nota = oldModel2.Nota, adjunto = oldModel2.adjunto });
                    }
                    break;

                case "CampoIndicador":
                    ValorCampo newModel3 = (ValorCampo)ContenidoNew;
                    newModelString = new JavaScriptSerializer().Serialize(newModel3);
                    if (newModel3.Id != 0)
                    {
                        ValorCampo oldModel3 = db.ValorCampo.Find(newModel3.Id);
                        oldModelString = new JavaScriptSerializer().Serialize(new { Id = oldModel3.Id, IdCampo = oldModel3.IdCampo, CampoPadre = oldModel3.CampoPadre.Id, Texto = oldModel3.Texto });
                    }
                    break;
                }


                Log log = new Log();
                log.UserId       = usuario;
                log.UserName     = usuario;
                log.UserMail     = usuario;
                log.Tarea        = Modelo;
                log.Accion       = Accion;
                log.ContenidoNew = newModelString;
                log.ContenidoOld = oldModelString;


                db.Log.Add(log);
                db.SaveChanges();
            }
        }