Как показать сгруппированный список на странице Razor View? - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь показать сгруппированный список с синтаксисом 'foreach' на странице просмотра Razor. Как я могу это сделать?

I made list like this. It works.
*before you read this: 'columnName1' is string, 'ColumnName2' is double.

// контроллер ---

var list = db.xxx.where(x => x.ID == 92).ToList();
return View(list);

//view---

<table class="">


@foreach (var controllerName in modle)
{
 <tr>
  <td>@controllerName.ColumnName1</td>
  <td>@controllerName.ColumnName2</td>
 </tr>
}

Я пытаюсь сделать ниже для группировки и суммирования. // контроллер

var list = db.xxx.where(x => x.ID == 92).ToList();

var list1 = list
.GroupBy(y => y.columnName1)
            .Select(group => new
            {
            columnName1 = group.Key,
            columnName2 = group.Sum(x => x.columnName2)
            })
            .ToList();


            return View(list1);

Я ожидаю показать список с группировкой и суммированием.

// таблица

columnName1  | columnName2(sum result)
USA          |  12
JAPAN        |  10

Ответы [ 2 ]

0 голосов
/ 27 апреля 2019
    it is almost same with marco's answer. 

    --make a view model

    public class CountryViewModel
    {
        public string Name { get; set;}
        public double Result {get; set;}
    }
    --at the controller need put 'ViewModel Name'
    var list1 = list.GroupBy(y => y.columnName1)
                   .Select(group => new CountryViewModel
                    {
                        Name = group.Key,
                        Result = group.Sum(x => x.columnName2)
                    })
                    .ToList();


     return View(list1);

--foreach was same (i didn't need @model syntax on the top in this case.
@foreach (var item in Model)
{
   <tr>
      <td>@item.Name</td>
      <td>@item.Result</td>
   </tr>
}
0 голосов
/ 25 апреля 2019

Для этого вам нужно создать класс модели представления, поскольку прямо сейчас вы передаете анонимный объект вашему представлению, что технически возможно при использовании dynamic, но я не поощряю это. Строго типизированное представление всегда даст вам ошибки времени компиляции, если вы ошибетесь:

public class CountryViewModel
{
    public string Name { get; set;}
    public double Result {get; set;}
}

Затем измените ваш метод действия, чтобы вернуть этот класс в представление:

var list1 = list.GroupBy(y => y.columnName1)
                .Select(group => new CountryViewModel
                {
                    Name = group.Key,
                    Result = group.Sum(x => x.columnName2)
                })
                .ToList();


 return View(list1);

По вашему мнению, измените определение модели на этот класс модели представления

@model Namespace.To.Your.CountryViewModel

И, наконец, вы можете снова использовать intellisense и привязку модели в каждом цикле:

@foreach (var item in Model)
{
   <tr>
      <td>@item.Name</td>
      <td>@item.Result</td>
   </tr>
}
...