/// <summary> /// Prüft verschiedene Kriterien, nach denen das Dokument bearbeitbar ist. Bei Einem Fehler ist der Rückgabewert /// ungleich null. /// </summary> /// <param name="documentID">die ID des Dokuments</param> /// <param name="topic">Das zugeordnete Thema, falls eines existiert.</param> /// <param name="document">Das Doukument, das der ID zugeordnet ist.</param> /// <returns></returns> private ActionResult CheckConstraints(int documentID, [CanBeNull] out Topic topic, out Document document) { topic = null; document = db.Documents.Find(documentID); if (document == null) return HTTPStatus(HttpStatusCode.NotFound, "Dokument-ID nicht gefunden."); if (document.LockTime != null) return HTTPStatus(HttpStatusCode.Forbidden, "Das Dokument ist derzeit gesperrt."); if (document.TopicID == null) return null; // Alle Checks bestanden topic = db.Topics.Find(document.TopicID.Value); if (IsTopicLocked(document.TopicID.Value)) return HTTPStatus(HttpStatusCode.Forbidden, "Da das Thema gesperrt ist, können Sie keine Dateien hochladen."); if (topic.IsReadOnly) { return HTTPStatus(HttpStatusCode.Forbidden, "Da das Thema schreibgeschützt ist, können Sie keine Dateien bearbeiten."); } return null; }
public ActionResult _CreateDocuments(DocumentContainer entityKind, int id) { if (Request.Files.Count == 0) return HTTPStatus(HttpStatusCode.BadRequest, "Es wurden keine Dateien empfangen."); if (id <= 0) return HTTPStatus(HttpStatusCode.BadRequest, "Die Dateien können keinem Ziel zugeordnet werden."); Topic topic = null; if (entityKind == DocumentContainer.Topic) { topic = db.Topics.Find(id); if (IsTopicLocked(id)) return HTTPStatus(HttpStatusCode.Forbidden, "Da das Thema gesperrt ist, können Sie keine Dateien hochladen."); if (topic.IsReadOnly) { return HTTPStatus(HttpStatusCode.Forbidden, "Da das Thema schreibgeschützt ist, können Sie keine Dateien bearbeiten."); } } var statusMessage = new StringBuilder(); int successful = 0; for (int i = 0; i < Request.Files.Count; i++) { HttpPostedFileBase file = Request.Files[i]; if (file == null) continue; if (string.IsNullOrWhiteSpace(file.FileName)) { statusMessage.AppendLine("Eine Datei hat einen ungültigen Dateinamen."); continue; } string fullName = Path.GetFileName(file.FileName); if (file.ContentLength == 0) { statusMessage.AppendFormat("Datei \"{0}\" hat keinen Inhalt.", fullName).AppendLine(); continue; } string filename = Path.GetFileNameWithoutExtension(file.FileName); string fileext = Path.GetExtension(file.FileName); if (!string.IsNullOrEmpty(fileext)) fileext = fileext.Substring(1); var revision = new Revision { SafeName = InvalidChars.Replace(filename, ""), FileSize = file.ContentLength, UploaderID = GetCurrentUserID(), Extension = fileext, GUID = Guid.NewGuid(), Created = DateTime.Now }; Document document = new Document(revision) { Deleted = null, DisplayName = fullName }; switch (entityKind) { case DocumentContainer.Topic: document.TopicID = id; break; case DocumentContainer.EmployeePresentation: document.EmployeePresentationID = id; break; default: throw new InvalidEnumArgumentException("entityKind", (int)entityKind, typeof(DocumentContainer)); } try { db.Documents.Add(document); db.SaveChanges(); // Damit die Revision die ID bekommt. Diese wird anschließend im Dateinamen hinterlegt document.LatestRevision = revision; db.SaveChanges(); string path = Path.Combine(Serverpath, revision.FileName); file.SaveAs(path); successful++; } catch (DbEntityValidationException ex) { var message = ErrorMessageFromException(ex); statusMessage.AppendFormat("Datei \"{0}\" konnte nicht in der Datenbank gespeichert werden.\n{1}", fullName, message) .AppendLine(); } catch (IOException) { statusMessage.AppendFormat("Datei \"{0}\" konnte nicht gespeichert werden.", fullName).AppendLine(); } } statusMessage.AppendFormat( successful == 1 ? "Eine Datei wurde erfolgreich verarbeitet." : "{0} Dateien wurden erfolgreich verarbeitet.", successful); // Ungelesen-Markierung aktualisieren if (topic != null && successful > 0) MarkAsUnread(topic); ViewBag.StatusMessage = statusMessage.ToString(); return _List(id, entityKind); }