Как сохранить списки в массив, а затем вернуться через viewbag - PullRequest
0 голосов
/ 13 марта 2020

Здравствуйте. У меня есть таблица сайтов, которая содержит 5 сайтов. Сейчас он циклически перебирает массив, но разделы model.offReport продолжают перезаписываться следующим сайтом в списке. Чтобы предотвратить это, в конце l oop я хочу добавить новые данные в массив, чтобы при возврате он возвращал данные для всех сайтов, а не только для последнего сайта, который находится в массив. В настоящее время у меня есть метод контроллера, который выглядит следующим образом

    foreach (Site s in sites)
            {

             foreach (OffSiteItemDetails d in s.ItemDetails)
             {

            ViewBag.OffReportColumns += new List<List<string>>()
            {
                s.Name,
                "",
                "",
                "Average Cost",
                "",
                "",
                "Average Cost (With labour)"
            };
            ViewBag.OffReportRows = new List<List<string>>()
            {

                new List<string>()
                {
                    "Parts",
                    "",
                    "",
                    osiPartCost[s.ID].ToString("C2"),
                    "",
                    "",
                    osiPartCost[s.ID].ToString("C2")
                },
                new List<string>()
                {
                    "",
                    "600000 series",
                    osiOpc6[s.ID].ToString("C2"),
                    "",
                    "600000 series",
                    osiOpc6[s.ID].ToString("C2"),
                    ""
                },
                new List<string>()
                {
                    "",
                    "700000 series",
                    osiOpc7[s.ID].ToString("C2"),
                    "",
                    "700000 series",
                    osiOpc7[s.ID].ToString("C2"),
                    ""
                },
                new List<string>()
                {
                    "",
                    "800000 series",
                    osiOpc8[s.ID].ToString("C2"),
                    "",
                    "800000 series",
                    osiOpc8[s.ID].ToString("C2"),
                    ""
                },
                new List<string>()
                {
                    "Tools",
                    "",
                    "",
                    osiTools[s.ID].ToString("C2"),
                     "",
                     "",
                    osiTools[s.ID].ToString("C2"),

                },
                new List<string>()
                {
                    "",
                    "900000 series",
                    osiOpc9[s.ID].ToString("C2"),
                    "",
                    "900000 series",
                    osiOpc9[s.ID].ToString("C2"),
                    ""
                },
                new List<string>()
                {
                    "",
                    "Other",
                    osiOpco[s.ID].ToString("C2"),
                    "",
                    "Other",
                    osiOpco[s.ID].ToString("C2"),
                    ""
                },
                new List<string>()
                {
                    "Components",
                    "",
                    "",
                    osiCompCost[s.ID].ToString("C2"),
                    "",
                    "",
                    osiLoCompCost[s.ID].ToString("C2")
                },
                new List<string>()
                {
                    "Items",
                    "",
                    "",
                    osiItemCost[s.ID].ToString("C2"),
                    "",
                    "",
                    osiLoItemCost[s.ID].ToString("C2")
                },
            };
            ViewBag.OffReporTotal = new List<List<string>>()
            {
                 new List<string>()
              {
                    "Total",
                    "",
                    "",
                    osiTotal[s.ID].ToString("C2"),
                    "",
                    "",
                    osiFltotal[s.ID].ToString("C2")
                },
            };


       }

 }


            ViewBag.osiGrandTotal = new List<List<string>>()
            {
                 new List<string>()
              {
                    "OSI Grand Total",
                    "",
                    "",
                    ostotal.ToString("C2"),
                    "",
                    "",
                    ofltotal.ToString("C2")
                },
            };


            return model;
        }
    }
}

, и вот мое мнение

   @foreach (Site s in sites)
        {


            <tr style="color:black">
                @foreach (var col in ViewBag.OffReportColumns)
                {
                    <th>@col </th>
                }
            </tr>

            @foreach (var row in ViewBag.OffReportRows)
            {
                <tr style="color:black">
                    @foreach (var cell in row)
                {
                        <td>@cell</td>
                }
                </tr>
                }


            @foreach (var row in ViewBag.OffReporTotal)
            {
                <tr style="font-size: 20px">
                    @foreach (var cell in row)
                {
                        <td>@cell</td>
                }
                </tr>

        }


        @foreach (var row in ViewBag.osiGrandTotal)
             {
            <tr style="font-size: 20px">
                @foreach (var cell in row)
                {
                    <td>@cell</td>
                }
            </tr>
             }

Любые предложения о том, как я могу go сделать это?

Ответы [ 2 ]

1 голос
/ 13 марта 2020

Просто установите переменную наподобие ViewBag.YourVariable и получите к ней доступ в виде:

@foreach(OffReportColumns column in ViewBag.YourVariable) { ... } 

Установка переменной в вашем контроллере выглядит следующим образом:

public IActionResult ControllerMethod()
{
   ViewBag.MyDyanmicVariable = new List<string>()
   {
      "String1",
      "String2",
      "String3",
   };
}

Поскольку ViewBag Dynami c, а не массив объектов, вы можете поместить туда любой тип, и компилятор просто доверяет вам, пока во время выполнения вы не установили правильные типы.

Требуется список списка строк:

ViewBag.OffReportColumns = new List<List<string>();

Затем в вашем foreach l oop произнесите ViewBag.OffReportColumns.Add (новый список ...). Тогда вам нужен foreach внутри foreach, чтобы получить данные для вывода.

0 голосов
/ 14 марта 2020

Хотя в использовании ViewBag нет ничего плохого, я настоятельно рекомендую ограничить его использование очень небольшими и тривиальными вещами - которые вам, возможно, придется передать на страницу.

Поскольку вы используете MVC (Контроллер представления «Модель») Я настоятельно рекомендую использовать модель для этого сценария.

Учитывая это, сначала нужно проектировать.

Нам нужен базовый c объект, который будет хранить некоторые строковые свойства - из быстрого подсчета кажется, что достаточно 7.

Давайте назовем его BaseModel:

public class BaseModel
{
    public string MyProperty { get; set; }
    public string MyProperty1 { get; set; }
    public string MyProperty2 { get; set; }
    public string MyProperty3 { get; set; }
    public string MyProperty4 { get; set; }
    public string MyProperty5 { get; set; }
    public string MyProperty6 { get; set; }
    public string MyProperty7 { get; set; }
}

Извините за отсутствие именования свойств строки, я оставлю это к вашим действиям.

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

С другой стороны, нам представляется следующее:

  1. OffReportColumns
  2. OffReportRows
  3. OffReporTotal
  4. OsiGrandTotal

Поэтому мы можем определить следующее - пусть назовем его MyModel:

public class MyModel
{
    public string Site { get; set; }
    public List<BaseModel> OffReportColumns { get; set; }
    public List<BaseModel> OffReportRows { get; set; }
    public List<BaseModel> OffReporTotal { get; set; }
    public List<BaseModel> OsiGrandTotal { get; set; }

}

Собственность сайта жесть guish им - пригодится в поле зрения. Для простоты я использовал строку - поскольку я не знаю, какой класс вашего сайта определен - вы можете выбрать тип Site для этого свойства.

Теперь моя модель представляет собой объект, который инкапсулирует 4 списка строк - каждый список является самоопределяемым и будет содержать 8 строковых свойств.

Теперь у нас есть основа c для нашей потребности.

Поскольку нам требуется список списка - мы можем инкапсулировать в новый объект, содержащий наш список списка и коллекцию сайтов:

public class ViewModel
{
    public List<MyModel> MyModels { get; set; }
    public List<string> MySites { get; set;}
}

Опять же для простоты я использовал список строк для наших коллекций сайтов - вы можете выбрать тип List<Site> для этого свойство.

В нашем методе Index мы можем сделать следующее для заполнения:

    public IActionResult Index()
    {
        viewModel = new ViewModel
        {
            MyModels = new List<MyModel>(),
            MySites = new List<string>()
        };

        foreach (Site s in sites)
        {
            foreach (OffSiteItemDetails d in s.ItemDetails)
            {
                MyModel model = new MyModel(); 
                model.Site = s.Name; //taking the assumption that Site has a name property?

                //OffReportColumns
                model.OffReportColumns = new List<BaseModel>();
                BaseModel baseModel = new BaseModel
                {
                    MyProperty = s.Name,
                    MyProperty1 = "",
                    MyProperty2 = "",
                    MyProperty3 = "Average Cost",
                    MyProperty4 = "",
                    MyProperty5 = "",
                    MyProperty6 = "Average Cost (With labour)"
                };
                model.OffReportColumns.Add(baseModel);
                ////////////////////////////////////////////////////

                //OffReportRows
                model.OffReportRows = new List<BaseModel>();
                baseModel = new BaseModel
                {
                    MyProperty = "Parts",
                    MyProperty1 = "",
                    MyProperty2 = "",
                    MyProperty3 = "osiPartCost[s.ID].ToString",
                    MyProperty4 = "",
                    MyProperty5 = "",
                    MyProperty6 = "osiPartCost[s.ID].ToString(C2)"
                };
                model.OffReportRows.Add(baseModel);

                baseModel = new BaseModel
                {
                    MyProperty = "",
                    MyProperty1 = "600000 series",
                    MyProperty2 = "osiOpc6[s.ID].ToString(C2)",
                    MyProperty3 = "",
                    MyProperty4 = "600000 series",
                    MyProperty5 = "osiOpc6[s.ID].ToString(C2)",
                    MyProperty6 = ""
                };
                model.OffReportRows.Add(baseModel);

                baseModel = new BaseModel
                {
                    MyProperty = "",
                    MyProperty1 = "700000 series",
                    MyProperty2 = "osiOpc7[s.ID].ToString()",
                    MyProperty3 = "",
                    MyProperty4 = "700000 series",
                    MyProperty5 = "osiOpc7[s.ID].ToString()",
                    MyProperty6 = ""
                };
                model.OffReportRows.Add(baseModel);
                //////////////////////////////////////////////////////

                //OffReporTotal
                model.OffReporTotal = new List<BaseModel>();
                baseModel = new BaseModel
                {
                    MyProperty = s.Name,
                    MyProperty1 = "",
                    MyProperty2 = "",
                    MyProperty3 = "Average Cost",
                    MyProperty4 = "",
                    MyProperty5 = "",
                    MyProperty6 = "Average Cost (With labour)"
                };
                model.OffReporTotal.Add(baseModel);
                ////////////////////////////////////
                ///you might need to continue with the populating process
                ///....
                ///....

                viewModel.MyModels.Add(model);
            }
        }

        return this.View(viewModel);
    }

Мы вернем нашу viewModel нашему представлению, и представление будет определено как:

@model ViewModel

@foreach (var s in Model.MySites)
{
    <tr style="color:black">
        // return a list of MyModels for the current site
        @foreach (var col in Model.MyModels.Where(c => c.Site == s).ToList())
        {
            foreach (var prop in col.OffReportColumns)
            {
                // display all the properties for
                <th>prop</th>
            }
        }
    </tr>
}
...