C# 如何将列表存储到数组中,然后通过viewbag返回
你好,我有一个站点表,其中包含5个站点。现在它在数组中循环,但是model.offReport部分不断被列表中的以下站点覆盖。为了防止这种情况,在循环结束时,我希望它将新数据添加到数组中,以便在我返回数据时,它将返回所有站点的数据,而不仅仅是数组中的最后一个站点的数据。 目前我有一个控制器方法,看起来像这样C# 如何将列表存储到数组中,然后通过viewbag返回,c#,arrays,asp.net-mvc,viewbag,C#,Arrays,Asp.net Mvc,Viewbag,你好,我有一个站点表,其中包含5个站点。现在它在数组中循环,但是model.offReport部分不断被列表中的以下站点覆盖。为了防止这种情况,在循环结束时,我希望它将新数据添加到数组中,以便在我返回数据时,它将返回所有站点的数据,而不仅仅是数组中的最后一个站点的数据。 目前我有一个控制器方法,看起来像这样 foreach (Site s in sites) { foreach (OffSiteItemDetails d in s.It
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>
}
有什么建议吗?只需设置一个变量,如ViewBag.YourVariable,然后在视图中访问它,如:
@foreach(OffReportColumns column in ViewBag.YourVariable) { ... }
在控制器中设置变量如下所示:
public IActionResult ControllerMethod()
{
ViewBag.MyDyanmicVariable = new List<string>()
{
"String1",
"String2",
"String3",
};
}
因为ViewBag是动态的,而不是对象数组,所以您可以在其中放入任何类型,编译器只需在运行时之前信任您已将正确的类型放置到位
需要字符串列表:
ViewBag.OffReportColumns = new List<List<string>();
然后在foreach循环中说ViewBag.OffReportColumns.Addnew List。。。。然后,您需要一个foreach中的foreach来获取用于输出的数据。尽管使用ViewBag没有什么错,但我强烈建议将其使用限制在非常小和琐碎的内容上,您可能需要将其传递到页面 由于您使用的是MVC“模型”视图控制器,我强烈建议您在此场景中使用模型 有了这一点,让设计先行 我们需要一个基本对象来存储一些字符串属性——从快速计数来看,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
非报告总额
奥西格兰道尔酒店
因此,我们可以定义以下内容—称之为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; }
}
该地产网站是为了区分它们-将在视图中派上用场。为了简单起见,我使用了字符串-因为我不知道您的站点类定义了什么-您可以为该属性选择类型Site
现在,我的模型是一个封装了4个字符串列表的对象——每个列表都是自定义的,将包含8个字符串属性
现在我们有了基本的生活必需品
由于我们需要一个列表列表-我们可以封装到一个新对象中,以包含我们的列表列表和网站集合:
public class ViewModel
{
public List<MyModel> MyModels { get; set; }
public List<string> MySites { get; set;}
}
同样为了简单起见,我在网站集合中使用了字符串列表——您可以为该属性选择类型列表
在我们的索引方法中,我们可以执行以下操作来填充:
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>
}
谢谢你的回复。很抱歉,我对MVC还比较陌生,还没搞清楚。当你说只设置一个变量ViewBag.YourVariable时,我有点困惑。我会在我的控制器方法中加入什么来实现这一点?为您的问题添加了一个示例。谢谢,但它仍然会覆盖以返回上一个站点的数据,而不是所有站点的数据。我必须将您生成的整个集合作为MyDynamicVariable,我已经编辑了我的问题以获得您的建议,并且还添加了我的查看页面的外观。也许你能告诉我这是怎么回事?再次感谢你的帮助