【问题标题】:How to store lists into an array and then return through a viewbag如何将列表存储到数组中,然后通过视图包返回
【发布时间】:2020-03-14 19:14:37
【问题描述】:

您好,我有一个包含 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>
             }

对我如何做这件事有什么建议吗?

【问题讨论】:

    标签: c# arrays asp.net-mvc viewbag


    【解决方案1】:

    只需设置一个变量,如 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.Add(new List ...)。然后你需要一个 foreach 中的一个 foreach 来获取输出数据。

    【讨论】:

    • 感谢您的回复。对不起,我对 MVC 还比较陌生,而且还在搞清楚。当您说“只需设置一个变量 ViewBag.YourVariable ”时,我有点困惑。我会在我的控制器方法中添加什么来完成此操作?
    • 为您的问题添加了一个示例。
    • 谢谢,但它仍然会覆盖以返回最后一个站点的数据,而不是所有站点的数据
    • 必须将您生成的整个集合作为 MyDynamicVariable,而不仅仅是最后一个。
    • 我已经编辑了我的问题以获得您的建议,并且我还添加了我的视图页面的外观。也许你能告诉我它有什么问题吗?再次感谢您的帮助
    【解决方案2】:

    尽管使用 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; }
    }
    

    请原谅缺少对字符串属性的命名,我将把它留给你做。

    现在我们需要另一个对象来将它们包装到您所需的列表中。

    从另一个角度看来,我们有以下几点:

    1. OffReportColumns
    2. OffReportRows
    3. OffReportTotal
    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; }
    
    }
    

    属性站点是为了区分它们 - 将在视图中派上用场。为简单起见,我使用了字符串 - 因为我不知道您的 Site 类定义了什么 - 您可以为该属性选择类型 Site。

    现在我的模型是一个封装了 4 个字符串列表的对象 - 每个列表都是自定义的,将包含 8 个字符串属性。

    现在我们有了基本的需求。

    由于我们需要一个列表列表 - 我们可以封装到一个新对象中以包含我们的列表列表和站点集合:

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

    再次为简单起见,我为我们的网站集合使用了字符串列表 - 您可以为该属性选择类型 List&lt;Site&gt;

    在我们的 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>
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-23
      • 2019-09-30
      • 2010-12-11
      • 2023-03-10
      • 1970-01-01
      相关资源
      最近更新 更多