Лучший отвечающий
Вернуть из ActionResult метода файл и представление.

Вопрос
-
Добрый день.
У меня имеется следующий метод:
[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 очень много сэмплов.
- Изменено Medet Tleukabiluly 10 марта 2014 г. 15:51
- Помечено в качестве ответа Maksim MarinovMicrosoft contingent staff, Moderator 11 марта 2014 г. 8:16
10 марта 2014 г. 15:44 -
Вы пытаетесь сделать невозможное. Браузер понимает только один тип контента при запросе, два нельзя. Нужно писать в ответ или разметку или бинарные данные.
Сделаем содержимое сообщества лучше, вместе!
- Помечено в качестве ответа Maksim MarinovMicrosoft contingent staff, Moderator 11 марта 2014 г. 8:16
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 очень много сэмплов.
- Изменено Medet Tleukabiluly 10 марта 2014 г. 15:51
- Помечено в качестве ответа Maksim MarinovMicrosoft contingent staff, Moderator 11 марта 2014 г. 8:16
10 марта 2014 г. 15:44 -
Вы пытаетесь сделать невозможное. Браузер понимает только один тип контента при запросе, два нельзя. Нужно писать в ответ или разметку или бинарные данные.
Сделаем содержимое сообщества лучше, вместе!
- Помечено в качестве ответа Maksim MarinovMicrosoft contingent staff, Moderator 11 марта 2014 г. 8:16
10 марта 2014 г. 18:24Модератор -
Спасибо, я уже понял это )) немного переделал сам подход что и как должно быть. Так что вопрос не актуален. Спасибо.
- Помечено в качестве ответа i-am-a-kernel 11 марта 2014 г. 21:29
11 марта 2014 г. 21:28