如何将这两个表与两个模型合并?

时间:2016-09-13 12:26:43

标签: javascript c# asp.net-mvc-5

如何在一张桌子上使用两张foreach,或者另外一种方法来计算我的点数和总数?

这是表格:

<div style="padding-top: 30px">
    <table id="table_id" class="display">
        <thead>
            <tr>
                <th>Month</th>
                <th>Count</th>
                <th>Total</th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model.Date1.Reverse())
        {
                <tr>
                    <td> @Html.DisplayFor(modelItem => item.theDate) </td>
                    <td> @Html.DisplayFor(modelItem => item.theCount) </td>
                </tr>
            }
            @foreach (var item in Model.Date2.Reverse())
        {
                <tr>
                    <td></td>
                    <td></td>
                    <td> @Html.DisplayFor(modelItem => item.theCount) </td>
                </tr>
            }

        </tbody>
    </table>
    </div>

这就是我打电话给模特的方式:

    public class QueryView
    {
        public IEnumerable<Date1> Date1 { get; set; }
        public IEnumerable<Date1> Date2 { get; set; }
    }
}
@model CWebPortal.Models.QueryView

这是显示的内容: table

我希望道达尔当然在同一条线上。

谢谢!

4 个答案:

答案 0 :(得分:2)

您需要并行遍历列表。

希望这些链接能够提供帮助

  1. iterate simultaneously through multiple list
  2. Iterate two Lists or Arrays with one ForEach statement in C#
  3.    @using (var e1 = Model.Date1.Reverse().GetEnumerator()) { using (var e2 = Model.Date2.Reverse().GetEnumerator()) { while (e1.MoveNext() && e2.MoveNext()) { var item1 = e1.Current; var item2 = e2.Current; item1.theDate item1.theCount item2.theCount } } }

答案 1 :(得分:0)

您可以将两个foreach循环转换为一个for循环,并为IEnumerables使用相同的索引。这可能是纠正这个问题的第一步,也是最简单的步骤。

作为第二步,我建议寻找重写此模型的方法。如果这三个数据紧密相关,那么你就有充足的理由创建一个包含所有数据的新对象。

最后,反转IEnumerables中项目顺序的视图让我觉得有点代码味道。这种最新到最旧的排序,特别是在两个可枚举的对象中完成,也很容易在模型中。

答案 2 :(得分:0)

在模型中,您可以添加另一个包含类Table的列表,该列将包含所有三个值。像下面的东西。

public IEnumerable<Table> TableLst { get; set; }

public class Table
{
    public DateTime Date { get; set; }
    public int count { get; set; }
    public int total { get; set; }
}

由于您有两个列表Date1和Date2,您可以使用LINQ轻松地根据日期加入这些列表并将其传递给控制器​​。

 var data = qv.Date1.Join(qv.Date2, d1 => d1.theDate, d2 => d2.theDate, (d1, d2) => new { d1, d2 });

        qv.Table = data.Select(t => new Table
        {
            Date = t.d1.theDate,
            count = t.d1.theCount,
            total = t.d2.theCount

        });

        return View(qv);

您还可以在控制器中的TableLst上执行排序并将其传递给模型。之后只有一个for循环很容易获得数据

  @foreach (var item in Model.TableLst)
        {
            <tr>
                <td> @Html.DisplayFor(modelItem => item.Date) </td>
                <td> @Html.DisplayFor(modelItem => item.count) </td>
                <td> @Html.DisplayFor(modelItem => item.total) </td>
           </tr>
        }

答案 3 :(得分:0)

使用intermidiate viewModel类对数据进行分组。

e.g。

public class QueryViewModel
{
    public DateTime displayDate {get; set;}
    public int Count1 {get; set;}
    public int count2 {get; set;}
}

 public class QueryView
 {
    public IEnumerable<QueryViewModel> DateList =new IEnumerable<QueryViewModel>();
    public IEnumerable<Date1> Date1 { get; set; }
    public IEnumerable<Date1> Date2 { get; set; }

    public  fillDates()
    {
       QueryViewModel qvm=new QueryViewModel()          
       int i=0;
       foreach(var item in Date1.Reverse())
       {
          qvm.displayDate = theDate;
          qvm.Count1  = theCount;
         DateList.Add(qvm);
       }

       int i=0;
       foreach(var item in Date2.Reverse())
       {
          DateList[i].Count2  = theCount;
          i++;
       }

       return DateList
    }
 }

在视图中使用fillDates()来呈现列表。