C# 如何将列表存储到数组中,然后通过viewbag返回

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

你好,我有一个站点表,其中包含5个站点。现在它在数组中循环,但是model.offReport部分不断被列表中的以下站点覆盖。为了防止这种情况,在循环结束时,我希望它将新数据添加到数组中,以便在我返回数据时,它将返回所有站点的数据,而不仅仅是数组中的最后一个站点的数据。 目前我有一个控制器方法,看起来像这样

    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,我已经编辑了我的问题以获得您的建议,并且还添加了我的查看页面的外观。也许你能告诉我这是怎么回事?再次感谢你的帮助