На представлении Index у нас уже есть ссылки на метод Delete, который будет удалять заявки. Так, теперь добавим этот метод в контроллер:
// Удаление заявки public ActionResult Delete(int id) { Request request = db.Requests.Find(id); // получаем текущего пользователя User user = db.Users.Where(m => m.Login == HttpContext.User.Identity.Name).First(); if (request != null && request.UserId==user.Id) { Lifecycle lifecycle = db.Lifecycles.Find(request.LifecycleId); db.Lifecycles.Remove(lifecycle); db.SaveChanges(); } return RedirectToAction("Index"); }
Во-первых, любой зарегистрированный пользователь может просто обратиться к данному методу, например, с помощью запроса Request/Delete/5. Но так как пятая заявка может не принадлежать данному пользователю, то мы вначале вводим проверку на принадлежность заявки, чтобы предотвратить несанкционированное удаление.
Во-вторых, поскольку при организации базы данных у нас таблица объектов жизненного цикла и таблица заявок связаны через внешний ключ, который применяет каскадное удаление, то, естественно, нам можно просто удалить объект жизненного цикла, а там по внешнему ключу удалится и связанный с ним объект заявки.
Функция загрузки сохраненных файлов с ошибками будет тривиальна. Добавим в контроллер следующий метод:
// загружаем файл public ActionResult Download(int id) { Request r = db.Requests.Find(id); if (r != null) { string filename = Server.MapPath("~/Files/" + r.File); string contentType = "image/jpeg"; string ext = filename.Substring(filename.LastIndexOf('.')); switch (ext) { case "txt": contentType = "text/plain"; break; case "png": contentType = "image/png"; break; case "tiff": contentType = "image/tiff"; break; } return File(filename, contentType, filename); } return Content("Файл не найден"); }
Объект Request у нас сохраняет в бд краткое имя файла без полного указания пути. Если файл не был прикреплен к заявке, то значение свойства
File будет равно null. В случае если оно определено, получаем полный путь файла в приложении через метод Server.MapPath("~/Files/" + r.File);
.
Так как предполагается, что файлы у нас в приложении будут сохраняться в папку Files, то мы ее название присоединяем к имени файла для получения полного пути.
Далее получаем расширение файла и в зависимости от него устанавливаем заголовок contentType. И затем метод File
возвращает пользователю
данный файл.