вы создадите еще одну функцию \ действие на вашем контроллере и передадите в нее данные из вашего представления. В зависимости от размера данных вы можете сделать это как QueryString (примечание: введите .ToString()
соображения, html-кодирование в этом подходе), но, скорее всего, вы сохраните экземпляр на стороне сервера, используя TempData[key]
иличто-то похожее.
Другой аспект того, что вы пытаетесь сделать (экспортировать файл Excel), будет обработан добавленным действием;Однако вместо того, чтобы вы обрабатывали всю запись Response в рамках действия, я рекомендую вам определить тип, который наследует тип FileResult
- где вы обрабатываете HttpResponseBase
в перегруженной функции WriteFile
(пример ниже).
XLSFileResult
Этот тип образца будет фактически записывать содержимое с разделением запятыми (CSV), но Content-Type
(в сочетании с Content-Disposition
) будет «указывать» клиенту, что этоФайл Excel - Response
ответит файлом «.xls».
Примечание: имя файла и расширение в этом примере фактически определяются при его инициализации - в действии контроллера.
public class XLSFileResult : FileResult
{
public XLSFileResult() : base(@"application/vnd.ms-excel")
{
Data = new List<UP>();
}
public IEnumerable<UP> Data { get; set; }
protected override void WriteFile(HttpResponseBase response)
{
// note: you'll want to handle this better; I'm just choosing a property of each complex type.
string[] lines = Data.Select(d => string.Join(", ", d.UserO.UserName , d.ProductO.PName)).ToArray();
byte[] buffer = response.ContentEncoding.GetBytes(string.Join(Environment.NewLine, lines));
response.BinaryWrite(buffer);
}
}
Пример действия \ Функция на контроллере
public ActionResult Details(int S)
{
SLMEntitiesDB dbContext = new SLMEntitiesDB();
var VL = (from U in dbContext.Users
join P in dbContext.Products
on U.PID equals P.PID
where P.PID == U.PID
select new UP()
{
UserO = U,
ProductO = P
}).Where(U => U.UserO.LID == S).ToList();
return View(VL);
}
protected FileResult HandleDataToFileResult(IEnumerable<UP> data)
{
return new XLSFileResult()
{
Data = data,
FileDownloadName = "MyFile.xls" //by virtue of this assignment, a 'Content-Disposition' Response.Header is added to HttpResponseBase
};
}
public FileResult GenerateFile()
{
var data = (IEnumerable<UP>)TempData["GenerateFile"];
return HandleDataToFileResult(data);
}
Страница бритвы
В этом примере страницы бритвы мы будем использовать ActionLink
...
@using SLMDemo0.Models
@model IEnumerable<UP>
@{
ViewBag.Title = "Details";
//Review TempData, it's session data that clears at the end of the next request
TempData["GenerateFile"] = Model.ToArray();
}
...
@Html.ActionLink("GenerateFile", "GenerateFile");