【发布时间】:2020-03-11 21:37:50
【问题描述】:
我有一个控制器方法循环遍历我的“站点”数据库表,但目前它只发布数组中最后一项的内容,并且发布的次数与数据库中的站点相同。
这是我的看法
@foreach (Site s in sites)
{
<tr style="color:black">
@foreach (var col in Model.OffReportColumns)
{
<th>@col</th>
}
</tr>
foreach (var row in Model.OffReportRows)
{
<tr style="color:black">
@foreach (var cell in row)
{
<td>@cell</td>
}
</tr>
}
foreach (var row in Model.OffReporTotal)
{
<tr style="font-size: 20px">
@foreach (var cell in row)
{
<td>@cell</td>
}
</tr>
}
}
这是我的控制器
namespace PIC_Program_1._0.Controllers
{
public class SummaryReportController : Controller
{
public ActionResult Index()
{
var model = GetSummaryReport();
return View("Index", model);
}
private SummaryReportModel GetSummaryReport()
{
PIC_Program_1_0Context db = new PIC_Program_1_0Context();
var items = db.Items.Where(x => x.deleted == false).ToList();
var components = db.Components.Where(x => x.deleted == false).ToList();
var parts = db.Parts.Where(x => x.deleted == false).ToList();
List<Site> sites = db.Sites.ToList();
//variables
float partcost = 0;
float compcost = 0;
float complastcost = 0;
float compretail = 0;
float itemcost = 0;
float itemlastcost = 0;
float itemretail = 0;
float opartcost = 0;
float ocompcost = 0;
float ocomplastcost = 0;
float ocompretail = 0;
float oitemcost = 0;
float oitemlastcost = 0;
float oitemretail = 0;
float lcompcost = 0;
float litemcost = 0;
float locompcost = 0;
float loitemcost = 0;
float tools = 0;
float otools = 0;
float total = 0;
float ltotal = 0;
float ostotal = 0;
float ofltotal = 0;
float pc6 = 0;
float pr6 = 0;
float pc7 = 0;
float pr7 = 0;
float pc8 = 0;
float pr8 = 0;
float pc9 = 0;
float pr9 = 0;
float opc6 = 0;
//float opr6 = 0;
float opc7 = 0;
//float opr7 = 0;
float opc8 = 0;
//float opr8 = 0;
float opc9 = 0;
//float opr9 = 0;
float pro = 0;
float pco = 0;
float plo = 0;
//float opro = 0;
float opco = 0;
//float oplo = 0;
//osi items
float[] osiItemCost = new float[sites.Count + 1];
float[] osiLoItemCost = new float[sites.Count + 1];
float[] osiItemLastCost = new float[sites.Count + 1];
//float[] osiItemRetail;
//osi components
float[] osiCompCost = new float[sites.Count + 1];
float[] osiLoCompCost = new float[sites.Count + 1];
float[] osiCompLastCost = new float[sites.Count + 1];
//float[] osiCompRetail;
//osi parts
float[] osiOpc6 = new float[sites.Count + 1];
float[] osiOpr6 = new float[sites.Count + 1];
float[] osiOpc7 = new float[sites.Count + 1];
float[] osiOpr7 = new float[sites.Count + 1];
float[] osiOpc8 = new float[sites.Count + 1];
float[] osiOpr8 = new float[sites.Count + 1];
float[] osiOpc9 = new float[sites.Count + 1];
float[] osiOpr9 = new float[sites.Count + 1];
float[] osiOpco = new float[sites.Count + 1];
float[] osiOpro = new float[sites.Count + 1];
float[] osiOplo = new float[sites.Count + 1];
//OSI TOTALS
float[] osiPartCost = new float[sites.Count + 1];
float[] osiTools = new float[sites.Count + 1];
float[] osiTotal = new float[sites.Count + 1];
float[] osiFltotal = new float[sites.Count + 1];
//float[] osiPartCost;
foreach (var p in parts)
{
if (p.PartID.StartsWith("6"))
{
pc6 += p.On_Hand * p.AverageCostCdn;
pr6 += p.On_Hand * p.PricePerUnit;
//opc6 += p.OffSiteCount * p.AverageCostCdn;
//opr6 += p.OffSiteCount * p.PricePerUnit;
}
else if (p.PartID.StartsWith("7"))
{
pc7 += p.On_Hand * p.AverageCostCdn;
pr7 += p.On_Hand * p.PricePerUnit;
//opc7 += p.OffSiteCount * p.AverageCostCdn;
//opr7 += p.OffSiteCount * p.PricePerUnit;
}
else if (p.PartID.StartsWith("8"))
{
pc8 += p.On_Hand * p.AverageCostCdn;
pr8 += p.On_Hand * p.PricePerUnit;
//opc8 += p.OffSiteCount * p.AverageCostCdn;
//opr8 += p.OffSiteCount * p.PricePerUnit;
}
else if (p.PartID.StartsWith("9"))
{
pc9 += p.On_Hand * p.AverageCostCdn;
pr9 += p.On_Hand * p.PricePerUnit;
//opc9 += p.OffSiteCount * p.AverageCostCdn;
//opr9 += p.OffSiteCount * p.PricePerUnit;
}
else
{
pco += p.On_Hand * p.AverageCostCdn;
pro += p.On_Hand * p.PricePerUnit;
//opco += p.OffSiteCount * p.AverageCostCdn;
//opro += p.OffSiteCount * p.PricePerUnit;
plo += p.On_Hand * p.LastCostCdn;
//oplo += p.OffSiteCount * p.LastCostCdn;
}
}
foreach (var c in components)
{
// New Average Cost Valuation = (pc6 + pc7 + pc8)
partcost = pc6 + pc7 + pc8;
opartcost = opc6 + opc7 + opc8;
tools = pc9 + pco;
otools = opc9 + opco;
//Add Labour
compcost += c.On_Hand * c.cost(1, false, false);
lcompcost += c.On_Hand * c.cost(1, false, true);
complastcost += c.cost(c.On_Hand, true, false);
compretail += c.On_Hand * c.PricePerUnit;
ocompcost += c.OffSiteCount * c.cost(1, false, false);
locompcost += c.OffSiteCount * c.cost(1, false, true);
ocomplastcost += c.cost(c.OffSiteCount, true, false);
ocompretail += c.OffSiteCount * c.PricePerUnit;
}
foreach (var i in items)
{
itemcost += i.On_Hand * i.cost(1, false, false);
litemcost += i.On_Hand * i.cost(1, false, true);
itemlastcost += i.cost(i.On_Hand, true, false);
itemretail += i.On_Hand * (float)i.PricePerUnit;
oitemcost += i.OffSiteCount * i.cost(1, false, false);
loitemcost += i.OffSiteCount * i.cost(1, false, true);
oitemlastcost += i.cost(i.OffSiteCount, true, false);
oitemretail += i.OffSiteCount * (float)i.PricePerUnit;
//on Site Parts Total valu
total = partcost + compcost + itemcost;
ltotal = partcost + lcompcost + litemcost;
//Off Site Parts Total valu
ostotal = opartcost + ocompcost + oitemcost;
ofltotal = opartcost + locompcost + loitemcost;
}
foreach (Site s in sites)
{
foreach (OffSiteItemDetails d in s.ItemDetails)
{
if (d.itemID != null)
{
osiItemCost[s.ID] = d.qty * db.Items.Where(x => x.ID == d.itemID).FirstOrDefault().cost(1, false, false);
osiLoItemCost[s.ID] += d.qty * db.Items.Where(x => x.ID == d.itemID).FirstOrDefault().cost(1, false, true);
osiItemLastCost[s.ID] += db.Items.Where(x => x.ID == d.itemID).FirstOrDefault().cost(d.qty, true, false);
//osiItemRetail[s.ID] += d.qty * db.Items.Where(x => x.ID == d.itemID).FirstOrDefault().PricePerUnit;
}
if (d.componentID != null)
{
osiPartCost[s.ID] = osiOpc6[s.ID] + osiOpc7[s.ID] + osiOpc8[s.ID];
osiTools[s.ID] = osiOpc9[s.ID] + osiOpco[s.ID];
osiCompCost[s.ID] = d.qty * db.Components.Where(x => x.ID == d.componentID).FirstOrDefault().cost(1, false, false);
osiLoCompCost[s.ID] += d.qty * db.Components.Where(x => x.ID == d.componentID).FirstOrDefault().cost(1, false, true);
osiCompLastCost[s.ID] += db.Components.Where(x => x.ID == d.componentID).FirstOrDefault().cost(d.qty, true, false);
//osiCompRetail[s.ID] += d.qty * db.Components.Where(x => x.ID == d.componentID).FirstOrDefault().PricePerUnit;
}
if (d.partID != null)
{
if (db.Parts.Where(x => x.ID == d.partID).FirstOrDefault().PartID.StartsWith("6"))
{
osiOpc6[s.ID] += d.qty * db.Parts.Where(x => x.ID == d.partID).FirstOrDefault().AverageCostCdn;
osiOpr6[s.ID] += d.qty * db.Parts.Where(x => x.ID == d.partID).FirstOrDefault().PricePerUnit;
}
else if (db.Parts.Where(x => x.ID == d.partID).FirstOrDefault().PartID.StartsWith("7"))
{
osiOpc7[s.ID] += d.qty * db.Parts.Where(x => x.ID == d.partID).FirstOrDefault().AverageCostCdn;
osiOpr7[s.ID] += d.qty * db.Parts.Where(x => x.ID == d.partID).FirstOrDefault().PricePerUnit;
}
else if (db.Parts.Where(x => x.ID == d.partID).FirstOrDefault().PartID.StartsWith("8"))
{
osiOpc8[s.ID] += d.qty * db.Parts.Where(x => x.ID == d.partID).FirstOrDefault().AverageCostCdn;
osiOpr8[s.ID] += d.qty * db.Parts.Where(x => x.ID == d.partID).FirstOrDefault().PricePerUnit;
}
else if (db.Parts.Where(x => x.ID == d.partID).FirstOrDefault().PartID.StartsWith("9"))
{
osiOpc9[s.ID] += d.qty * db.Parts.Where(x => x.ID == d.partID).FirstOrDefault().AverageCostCdn;
osiOpr9[s.ID] += d.qty * db.Parts.Where(x => x.ID == d.partID).FirstOrDefault().PricePerUnit;
}
else
{
osiOpco[s.ID] += d.qty * db.Parts.Where(x => x.ID == d.partID).FirstOrDefault().AverageCostCdn;
osiOpro[s.ID] += d.qty * db.Parts.Where(x => x.ID == d.partID).FirstOrDefault().PricePerUnit;
osiOplo[s.ID] += d.qty * db.Parts.Where(x => x.ID == d.partID).FirstOrDefault().LastCostCdn;
}
}
//Off Site Parts Total valu
osiTotal[s.ID] = osiPartCost[s.ID] + osiCompCost[s.ID] + osiItemCost[s.ID];
osiFltotal[s.ID] = osiPartCost[s.ID] + osiLoCompCost[s.ID] + osiLoItemCost[s.ID];
}
}
var model = new SummaryReportModel()
{
Title = "Valuation",
ReportTitle = "Valuation - Summary Report",
OffReportTitle = "Valuation - Off Site Parts"
};
model.Tital = new List<List<string>>()
{
new List<string>()
{
"Valuation - Main Inventory",
},
};
model.ValuationColumns = new List<string>()
{
"",
"",
"",
"Average Cost",
"",
"",
"Average Cost (With labour)"
};
model.ValuationRows = new List<List<string>>()
{
new List<string>()
{
"Parts",
"",
"",
partcost.ToString("C2"),
"",
"",
partcost.ToString("C2")
},
new List<string>()
{
"",
"600000 series",
pc6.ToString("C2"),
"",
"600000 series",
pc6.ToString("C2"),
""
},
new List<string>()
{
"",
"700000 series",
pc7.ToString("C2"),
"",
"700000 series",
pc7.ToString("C2"),
""
},
new List<string>()
{
"",
"800000 series",
pc8.ToString("C2"),
"",
"800000 series",
pc8.ToString("C2"),
""
},
new List<string>()
{
"Tools",
"",
"",
tools.ToString("C2"),
"",
"",
tools.ToString("C2")
},
new List<string>()
{
"",
"900000 series",
pc9.ToString("C2"),
"",
"900000 series",
pc9.ToString("C2"),
""
},
new List<string>()
{
"",
"Other",
pco.ToString("C2"),
"",
"Other",
pco.ToString("C2"),
""
},
new List<string>()
{
"Components",
"",
"",
compcost.ToString("C2"),
"",
"",
lcompcost.ToString("C2")
},
new List<string>()
{
"Items",
"",
"",
itemcost.ToString("C2"),
"",
"",
litemcost.ToString("C2")
},
};
//totlal class
model.Total = new List<List<string>>()
{
new List<string>()
{
"Total",
"",
"",
total.ToString("C2"),
"",
"",
ltotal.ToString("C2")
},
};
model.SecondTital = new List<List<string>>()
{
new List<string>()
{
"Valuation - Off Site Parts"
},
};
List<SummaryReportModel> a = new List<SummaryReportModel>(); // this is what you'll return to the view
foreach (Site s in sites)
{
SummaryReportModel y = new SummaryReportModel();
foreach (OffSiteItemDetails d in s.ItemDetails)
{
y.OffReportColumns = new List<string>()
{
s.Name,
"",
"",
"Average Cost",
"",
"",
"Average Cost (With labour)"
};
y.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")
},
};
y.OffReporTotal = new List<List<string>>()
{
new List<string>()
{
"Total",
"",
"",
osiTotal[s.ID].ToString("C2"),
"",
"",
osiFltotal[s.ID].ToString("C2")
},
};
}
a.Add(y);
}
//return View(a);
model.osiGrandTotal = new List<List<string>>()
{
new List<string>()
{
"OSI Grand Total",
"",
"",
ostotal.ToString("C2"),
"",
"",
ofltotal.ToString("C2")
},
};
return model;
}
}
}
这是我的“站点”和“OffSiteItemDetails”表的一部分,用于显示结构
网站数据库
OffSiteItemDetails 数据库
我希望它循环并发布每个站点的值(它通过 (s.ID) 执行此操作。)它当前循环但它只是发布最后一个 s.Id(站点 ID)的数据表,它会这样做 5 次(有 5 个站点)。我希望它在每个站点循环时分开并发布数据,我只是不知道该怎么做
这是我的模型类
public class SummaryReportModel
{
public string Title { get; set; }
public string ReportTitle { get; set; }
public string OffReportTitle { get; set; }
public List<string> ValuationColumns { get; set; }
public List<string> OffReportColumns { get; set; }
public List<List<string>> ValuationRows { get; set; }
public List<List<string>> OffReportRows { get; set; }
public List<List<string>> Total { get; set; }
public List<List<string>> OffReporTotal { get; set; }
public List<List<string>> Tital { get; set; }
public List<List<string>> SecondTital { get; set; }
public List<List<string>> osiGrandTotal { get; set; }
}
【问题讨论】:
-
您是否进行了分析以确保您的“网站”数据在到达数据修饰方法之前是正确的?
-
@FrankThomas 是的,我有。这是正确的.. 我只是不知道如何为 5 个站点创建 5 个表,而不是为数组中的最后一个站点创建 5 个表
-
你能发布模型吗?我怀疑您将同一属性的值设置了五次。循环中的每次迭代都需要有自己的对象。例如,我希望在您的代码中看到带有 List
x...的 obj_A,您应该有 foreach(var item in myCollection){ var y = new property;//set values then...obj_a.x.添加(y)} -
“它当前循环,但它只发布最后一个 s.Id 的数据”不要为每个站点初始化
model.OffReportColumns和model.OffReportRows,而是使用model.OffReportRows.Add(...)。并删除视图中的foreach站点 -
@BillRuhl 这不是问题,我已经测试过了。我很确定问题是因为在循环完成之前我不会“返回模型”。到那时,这些值将等于数组中的最后一个值。我只是不确定如何在每个循环后返回它
标签: c# asp.net-mvc linq