public ActionResult Crear(Guid? id, Guid? TipoArchivoID)
        {
            if (id == null || TipoArchivoID == null) return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            var tipoArchivo = db.TipoArchivos.Find(TipoArchivoID);
            if (tipoArchivo == null) return HttpNotFound();
            var pieza = db.Piezas.Find(id);
            if (pieza == null) return HttpNotFound();

            var archivoPieza = new ArchivoPieza()
            {
                PiezaID = pieza.PiezaID,
                Status = true,
                TipoArchivoID = tipoArchivo.TipoArchivoID,
                TipoArchivo = tipoArchivo,
                Orden = pieza.ArchivosPiezas.Where(a => a.TipoArchivoID == tipoArchivo.TipoArchivoID).Count() + 1
            };

            archivoPieza.MostrarArchivos = new List<MostrarArchivo>();

            foreach (var item in db.TipoMostrarArchivos.Where(a => a.Status).ToList())
            {
                //crear en el archivo objetos temporales

                var tempMostrarArchivo = new MostrarArchivo()
                {
                    ArchivoPiezaID = archivoPieza.ArchivoPiezaID,
                    Status = false,
                    TipoMostrarArchivo = item,
                    TipoMostrarArchivoID = item.TipoMostrarArchivoID,
                };
                archivoPieza.MostrarArchivos.Add(tempMostrarArchivo);
            }

            if (!Directory.Exists(Server.MapPath(tipoArchivo.Ruta)))
                Directory.CreateDirectory(Server.MapPath(tipoArchivo.Ruta));

            //ViewBag.nombreArchivo = tipoArchivo.Nombre;
            //ViewBag.Lista_TipoMostrarArchivos = ;

            return PartialView("_Crear", archivoPieza);
        }
        public ActionResult Crear(ArchivoPieza archivoPieza, HttpPostedFileBase FileArchivo)
        {
            #region Inicio de crear

            //mostrar los archivos no se guardara en el historial, por que su implementacion es muy costosa

            var listaMostrarArchivos = new List<MostrarArchivo>();

            foreach (var item in db.TipoMostrarArchivos.Where(a => a.Status).ToList())
            {
                string keyStatus = Request.Form["mosArc_" + item.TipoMostrarArchivoID + "_Status"];
                bool valorStatus = keyStatus == "true,false" ? true : false;
                var tempMostrarArchivo = new MostrarArchivo()
                {
                    Status = valorStatus,
                    TipoMostrarArchivo = item,
                    TipoMostrarArchivoID = item.TipoMostrarArchivoID
                };

                listaMostrarArchivos.Add(tempMostrarArchivo);
            }

            #endregion

            try
            {

                #region Validaciones previas

                //comprobar las extensiones validas
                var tipoArchivo = db.TipoArchivos.Find(archivoPieza.TipoArchivoID);

                archivoPieza.Extension = Path.GetExtension(FileArchivo.FileName);

                if (!tipoArchivo.ExtensionesAceptadas.Replace(" ", "").Split(',').Any(a => "." + a == archivoPieza.Extension))
                    ModelState.AddModelError("", "Archivo no compatible.");

                if (FileArchivo == null)
                    ModelState.AddModelError("", "Seleccione un archivo");

                #endregion

                if (ModelState.IsValid)
                {
                    //Crear la entidad

                    #region pre-creacion de la entidad

                    //validar que la carpeta del tipo de archivo exista

                    if (!Directory.Exists(Server.MapPath(tipoArchivo.Ruta)))
                        Directory.CreateDirectory(Server.MapPath(tipoArchivo.Ruta));

                    if (!Directory.Exists(Server.MapPath(tipoArchivo.Ruta + "thumb/")))
                        Directory.CreateDirectory(Server.MapPath(tipoArchivo.Ruta + "thumb/"));

                    //Agregando valores que faltan
                    archivoPieza.ArchivoPiezaID = Guid.NewGuid();

                    archivoPieza.NombreArchivo = Guid.NewGuid().ToString();

                    archivoPieza.Orden = db.ArchivoPiezas.Where(a => a.TipoArchivoID == archivoPieza.TipoArchivoID && a.PiezaID == archivoPieza.PiezaID).Count() + 1;

                    archivoPieza.TipoArchivo = tipoArchivo;

                    string rutaGuardar = Server.MapPath(archivoPieza.Ruta);

                    FileArchivo.SaveAs(rutaGuardar);

                    FileArchivo.InputStream.Dispose();
                    FileArchivo.InputStream.Close();
                    GC.Collect();

                    #region Creacion de la miniatura

                    //generar la mini
                    switch (archivoPieza.Extension)
                    {
                        //imagenes
                        case ".jpg":
                        case ".png":
                        case ".tiff":
                            Thumbnail mini = new Thumbnail()
                            {
                                OrigenSrc = rutaGuardar,
                                DestinoSrc = Server.MapPath(archivoPieza.RutaThumb),
                                LimiteAnchoAlto = 220
                            };
                            mini.GuardarThumbnail();
                            break;
                        //videos
                        case ".mp4":
                        case ".avi":
                            break;
                    }

                    #endregion

                    #endregion

                    db.ArchivoPiezas.Add(archivoPieza);
                    db.SaveChanges();

                    //------ Logica HISTORIAL

                    #region Generar el historial

                    // Generar el historial
                    var historialLog =
                        HistorialLogica.CrearEntidad(
                        archivoPieza,
                        archivoPieza.GetType().Name,
                        archivoPieza.ArchivoPiezaID.ToString(),
                        User.UsuarioID,
                        db);

                    #endregion

                    #region Guardar el historial

                    //Guardar cambios si todo salio correcto
                    if (historialLog != null)
                    {
                        //Guardar la entidad
                        db.SaveChanges();

                        //Guardar el historial
                        db.HistorialLogs.Add(historialLog);
                        db.SaveChanges();
                    }
                    else
                    {
                        throw new Exception();
                    }

                    #endregion

                    //------

                    foreach (var item in listaMostrarArchivos)
                    {
                        item.ArchivoPiezaID = archivoPieza.ArchivoPiezaID;

                        db.MostrarArchivos.Add(item);
                        db.SaveChanges();
                    }

                    //Logica para terminar la instruccion
                    #region logica finalizar

                    AlertaSuccess(string.Format("Se guardo archivo {0} <b>{1}</b>", tipoArchivo.Nombre, archivoPieza.Titulo), true);

                    string url = "";
                    bool esImagen = tipoArchivo.Temp == "imagen_clave" ? true : false;
                    var tipoMostrarArchivo = db.TipoMostrarArchivos.FirstOrDefault(a => a.Nombre == "Completos");
                    if (esImagen)
                        url = Url.Action("ContenedorImagen", "ArchivoPieza", new { id = archivoPieza.PiezaID, tipoMostrarArchivoID = tipoMostrarArchivo.TipoMostrarArchivoID, esCompleta = true });
                    else
                        url = Url.Action("Lista", "ArchivoPieza", new { id = archivoPieza.PiezaID, TipoArchivoID = tipoArchivo.TipoArchivoID, esCompleta = true });

                    #endregion

                    return Json(new { success = true, url = url, idPieza = archivoPieza.PiezaID, esImagen = esImagen });
                }
            }
            catch (Exception)
            {

                ModelState.AddModelError("", "Error desconocido.");
            }

            archivoPieza.MostrarArchivos = listaMostrarArchivos;

            return PartialView("_Crear", archivoPieza);
        }