Как передать список из метода в другой метод - PullRequest
1 голос
/ 05 ноября 2019

Как передать приведенное ниже действие другому действию, чтобы экспортировать его в таблицу Excel, мне нужно передать список VL другому действию

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();
TempData["Exc"] = VL; 
    return View(VL);
}

и другому действию в том же контроллере, но это не такрабочая

public void ExportToExcel()
        {

            var V = TempData["Exc"] as List;
            ExcelPackage pck = new ExcelPackage();
            ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Report");
            ws.Cells["A1"].Value = "UserName";
            int rowStart = 1;
            foreach (var item in V)// here is the error 
            {
                ws.Cells[string.Format("A{0}", rowStart)].Value = item.UserO.CN;

1 Ответ

1 голос
/ 05 ноября 2019

вы создадите еще одну функцию \ действие на вашем контроллере и передадите в нее данные из вашего представления. В зависимости от размера данных вы можете сделать это как 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");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...