none
Вернуть из ActionResult метода файл и представление. RRS feed

  • Вопрос

  • Добрый день.

    У меня имеется следующий метод:

            [HttpGet]
            [Authorize]
            public ActionResult DownloadFile(int id,bool? accept = false)
            {
                TempData["id"] = id;
                if (accept.Value)
                {
                    var fileName = _fileRepository.GetById(id).FileFullName;
                    byte[] fileArray = _steganographyService.DownloadFile(id);
                    var outFile = File(fileArray, System.Net.Mime.MediaTypeNames.Application.Octet, fileName);
    
                    MemoryStream fs = new MemoryStream(fileArray);
                    
                    //MD5
                    var md5 = MD5.Create();
                    ViewData["MD5"] = BitConverter.ToString(md5.ComputeHash(fs));
    
                    //SHA1
                    SHA256Managed sha = new SHA256Managed();
                    ViewData["SHA1"] = BitConverter.ToString(sha.ComputeHash(fs));
    
                    return outFile;// ВОТ ТУТ ВОПРОС
                }
                return View();
            }

    но я не знаю что можно придумать что бы месте обозначенным комментарием "ВОТ ТУТ ВОПРОС" вернуть кроме файла еще и представление. Пытался использовать Tuple но не получилось, так как не возможно привести Tuple к ActionResult. Возможно есть какой то способ? Может быть как то перестроить метод с точки зрения общей архитектуры. Подскажите.

    10 марта 2014 г. 13:55

Ответы

  • нужен класс, например когда вы грузите представление, вы передаете из контроллера некую информацию которую хотите отобразить в представлении. так вот,

    допустим класс

    public class BasicModel
    {
    public DataModel dataModel { get; set; }
    public FilterModel filterModel { get; set; }
    public AdditionalModel addonModel { get; set; }
    public FileModel fileModel { get; set; }
    public SecurityModel securityModel { get; set; }
    }
    
    public class DataModel { //.. }
    public class FilterModel { //.. }
    public class AdditionalModel { //.. }
    public class FileModel { //.. }
    public class SecurityModel { //.. }

    вы присвайваете в экземпляр класса baseModel некие данные, нужные для текущего представления, затем передаете через контроллер,

    в вашем случае в свойство baseModel.fileModel присваеваем файл, и передаем весь baseModel целиком в представление. а там что хотите, показать ссылку на файл, или еще что нибудь.

    и тогда все поменяется примерно так

    public ActionResult DownloadFile(int id,bool? accept = false){ baseModel b = new BaseModel(); b.fileModel = getFile(id, accept); return View(b); } private File getFile(int id, bool? accept) { TempData["id"] = id; if (accept.Value) { var fileName = _fileRepository.GetById(id).FileFullName; byte[] fileArray = _steganographyService.DownloadFile(id); var outFile = File(fileArray, System.Net.Mime.MediaTypeNames.Application.Octet, fileName); MemoryStream fs = new MemoryStream(fileArray); //MD5 var md5 = MD5.Create(); ViewData["MD5"] = BitConverter.ToString(md5.ComputeHash(fs)); //SHA1 SHA256Managed sha = new SHA256Managed(); ViewData["SHA1"] = BitConverter.ToString(sha.ComputeHash(fs)); return outFile;

    } return null; }


    вам нужно не много почитать про MVC, по ссылке http:///asp.net очень много сэмплов.




    10 марта 2014 г. 15:44
  • Вы пытаетесь сделать невозможное. Браузер понимает только один тип контента при запросе, два нельзя. Нужно писать в ответ или разметку или бинарные данные.

    Сделаем содержимое сообщества лучше, вместе!

    10 марта 2014 г. 18:24
    Модератор
  • Спасибо, я уже понял это )) немного переделал сам подход что и как должно быть. Так что вопрос не актуален. Спасибо.
    • Помечено в качестве ответа i-am-a-kernel 11 марта 2014 г. 21:29
    11 марта 2014 г. 21:28

Все ответы

  • нужен класс, например когда вы грузите представление, вы передаете из контроллера некую информацию которую хотите отобразить в представлении. так вот,

    допустим класс

    public class BasicModel
    {
    public DataModel dataModel { get; set; }
    public FilterModel filterModel { get; set; }
    public AdditionalModel addonModel { get; set; }
    public FileModel fileModel { get; set; }
    public SecurityModel securityModel { get; set; }
    }
    
    public class DataModel { //.. }
    public class FilterModel { //.. }
    public class AdditionalModel { //.. }
    public class FileModel { //.. }
    public class SecurityModel { //.. }

    вы присвайваете в экземпляр класса baseModel некие данные, нужные для текущего представления, затем передаете через контроллер,

    в вашем случае в свойство baseModel.fileModel присваеваем файл, и передаем весь baseModel целиком в представление. а там что хотите, показать ссылку на файл, или еще что нибудь.

    и тогда все поменяется примерно так

    public ActionResult DownloadFile(int id,bool? accept = false){ baseModel b = new BaseModel(); b.fileModel = getFile(id, accept); return View(b); } private File getFile(int id, bool? accept) { TempData["id"] = id; if (accept.Value) { var fileName = _fileRepository.GetById(id).FileFullName; byte[] fileArray = _steganographyService.DownloadFile(id); var outFile = File(fileArray, System.Net.Mime.MediaTypeNames.Application.Octet, fileName); MemoryStream fs = new MemoryStream(fileArray); //MD5 var md5 = MD5.Create(); ViewData["MD5"] = BitConverter.ToString(md5.ComputeHash(fs)); //SHA1 SHA256Managed sha = new SHA256Managed(); ViewData["SHA1"] = BitConverter.ToString(sha.ComputeHash(fs)); return outFile;

    } return null; }


    вам нужно не много почитать про MVC, по ссылке http:///asp.net очень много сэмплов.




    10 марта 2014 г. 15:44
  • Вы пытаетесь сделать невозможное. Браузер понимает только один тип контента при запросе, два нельзя. Нужно писать в ответ или разметку или бинарные данные.

    Сделаем содержимое сообщества лучше, вместе!

    10 марта 2014 г. 18:24
    Модератор
  • Спасибо, я уже понял это )) немного переделал сам подход что и как должно быть. Так что вопрос не актуален. Спасибо.
    • Помечено в качестве ответа i-am-a-kernel 11 марта 2014 г. 21:29
    11 марта 2014 г. 21:28