Как обрабатывать различные ActionResults для действия контроллера ASP.NET MVC - PullRequest
0 голосов
/ 15 декабря 2009

У меня не идеальная ситуация, когда загруженные файлы хранятся во внутренней сетевой папке. Таким образом, в базе данных я сохраняю путь к тому месту, где был сохранен файл, но вполне возможно, что файл будет удален из синхронизации базы данных. Таким образом, в действии Контроллера я ищу информацию о загрузке и проверяю, что все правильно. Это можно подытожить примерно так:

public ActionResult GetUploadedFile(int uploadId){
    var uploadedFile = Repository<Upload>.FirstOrDefault(upload => upload.ID == uploadID);
    if(uploadedFile == default(Upload)){
        return View("InvalidUpload");
    }
    if(File.Exists(uploadFile.Path)){
        var fileInfo = new FileInfo(uploadFile.Path);
        var contentType = HttpContext.GetMimeTypeForFileInfo(fileInfo) // my lookup extension method
        return File(uploadFile.Path, contentType, uploadFile.Name);
    }
    return View("InvalidUpload");
}

Проблема в том, что это действие в настоящее время доступно по ссылке в представлении, загруженном через AJAX. Поэтому, когда файл существует и все в порядке, в браузере откроется стандартное диалоговое окно «Что вы хотите сделать с этим файлом», и контент останется видимым для пользователя. Проблема заключается в других путях через код. Возврат представления приводит пользователя к совершенно новому URL. А затем, нажав назад, вы вернетесь туда, где они были (это в основном динамические вкладки jQuery, так что ничего особенного, но все же это большое неудобство).

Так что я ищу, как другие могли справиться с этой ситуацией, поскольку это не кажется необычным. Или даже некоторые отзывы, чтобы сделать это немного более удобным для пользователя. Я не могу сказать, где хранится файл, поэтому изменить его нельзя.

1 Ответ

0 голосов
/ 15 декабря 2009

Существуют различные типы результатов действий, которые вы можете использовать.

Обычно, когда у меня есть метод контроллера, который выводит что-то отличное от представления, я использую действие ContentResult.

public ContentResult GetUploadedFile(int uploadId){

Некоторые типы результатов:

  1. ViewResult - представляет HTML и разметку.
  2. EmptyResult - не представляет результата.
  3. RedirectResult - представляет перенаправление на новый URL.
  4. JsonResult - представляет результат нотации объекта JavaScript, который можно использовать в приложении AJAX.
  5. JavaScriptResult - представляет скрипт JavaScript.
  6. ContentResult - представляет текстовый результат.
  7. FileContentResult - представляет загружаемый файл (с двоичным содержимым).
  8. FilePathResult - представляет загружаемый файл (с путем).
  9. FileStreamResult - представляет загружаемый файл (с потоком файлов).

Список взят здесь

...