Хотя в использовании 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; }
}
Извините за отсутствие именования свойств строки, я оставлю это к вашим действиям.
Теперь нам нужен еще один объект, чтобы включить их в требуемый список.
С другой стороны, нам представляется следующее:
- OffReportColumns
- OffReportRows
- OffReporTotal
- 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>
}