按类型对列表中的项目进行配对,并在一个循环中显示在视图中

时间:2016-11-23 09:58:29

标签: c# asp.net-mvc .net-4.5

Model.Results 

是一个包含结果模型列表的列表对象。

public List<result> Results {get; set;}

class result
{
   public int Id {get; set;}
   public int resultId {get; set;}
   public string resultName {get; set;}
   public int resultTypeId {get; set;}
   public string resultValue {get; set;}
}

我现在需要做的是在视图中直接显示该列表:

@foreach(var result in Model.Results)
{
    <ul>
    <li> @result.resultName</li>
    <li> @result.resultValue</li>
    </ul>
}

但我需要做的是检查resultTypeId是否相同我想在同一行显示resultValue:

 @foreach(var result in Model.Results)
 {
     <ul>
     <li> @result.resultName</li>
     @if(result.resultTypeId == any other result.resultTypeId in the list)
     {
        <li> @result.resultValue - @the other result.resultValue</li>
      }
     @else
    {
        <li> @result.resultValue</li>
    }
   </ul>
 }

如果您需要我说明更多,请告诉我。当我看到逻辑时,它看起来很直接,但是当我开始编码时,我看不到它的方法。

提前致谢。

3 个答案:

答案 0 :(得分:1)

在模型中创建一个属性,将所有resultTypeId作为列表返回:

public IEnumerable<int> ResultsTypeIds
{
    get
    {
        return Results.DistinctBy(x=>x.resultTypeId).Select(x=>x.resultTypeId);    
    }
}

在您的视图中,您可以对该集合进行itterate

@foreach(var resultTypeId in Model.ResultsTypeIds)
{
    <ul>
    @foreach(var result in Model.Results)
    {
        <li>@result.resultValue</li>
    }
    </ul>
}

答案 1 :(得分:1)

您可以按ID分组您的商品:

 @foreach(var resultGroup in Model.Results.GroupBy(result => result.resultTypeId))
 {
     <ul>
     <li> @resultGroup.First().resultName</li>
     @foreach (var result in resultGroup) {
        <li> @result.resultValue</li>
     }
     </ul>
 }

答案 2 :(得分:1)

我建议按照视图预期的方式格式化数据,例如:

Model.Results.GroupBy(r=>r.resultTypeId)
     .Select(gr=>new {resultTypeId = gr.Key, resultName = gr.First().resultName,  Items = gr.ToList()})
     .ToList();

比视图简单地遍历每个组中的组和项目:

@foreach(var group in Model.GroupedResults)
 {
     <ul>
     <li> @group.resultName</li>
     <li>
     @foreach(var item in group.Items)
     {
       @item.resultValue <br/>
     }
     </li>
   </ul>
 }

你可能想要其他东西作为视图标记,但它应该给你一个想法。