2016-05-07 1 views
3

У меня есть сводный обзор заявления, что мне нужно показать общий баланс на счете клиентов по месяцам и годам.ASP.Net MVC - Razor Отображение итогов счета для клиентов по месяцам/годам Столбцы

Я создал запрос linq и просмотрел модели, которые успешно извлекают эти данные из базы данных.

Я хочу отобразить эти данные в виде таблиц, например.

Посмотреть Желаемая

enter image description here

Мой LINQ код

var monthlyTotals = from t in db.InvoiceItems.AsEnumerable() 
           // where t.Invoice.LegalFile.IsClosed == false 
            group t by t.Invoice.LegalFile.Client into g 
            select new StatementSummaryVM 
            { 
             Client = g.Key, 
             GrandTotal = g.Sum(x => x.AmountInclVAT), 
             MonthlyTotals = from i in g 
               group i by new 
                { 
                 month = i.ItemDate.Month, 
                 year = i.ItemDate.Year 
                } 
               into d 
               select new MonthlyTotalsVM 
               { 
                Date = new DateTime(d.Key.year, d.Key.month,1), 
                Amount = d.Sum(s => s.AmountInclVAT) 
               } 
            }; 

      return monthlyTotals; 

     } 

Мой вид Модель

public class StatementSummaryVM 
{ 
    [Display(Name = "File No.")] 
    public int Id { get; set; } 

    public Client Client { get; set; } 
    public IEnumerable<MonthlyTotalsVM> MonthlyTotals { get; set; } 
    [Display(Name = "Grand Total")] 
    [DisplayFormat(DataFormatString = "{0:C}")] 
    public decimal GrandTotal { get; set; } 
} 

public class MonthlyTotalsVM 
{ 
    [DisplayFormat(DataFormatString = "{0:MMM-yyyy}")] 
    public DateTime Date { get; set; } 
    [DisplayFormat(DataFormatString = "{0:C}")] 
    public decimal Amount { get; set; } 
} 

Мой текущий вид Код

<table class="table"> 
    <tr> 
     <th>File No.</th> 
     <th>Client</th> 
     <th>Grand Total</th> 

     @foreach (var item in Model) 
     { 
      <th></th> 
      foreach (var monthlyTotal in item.MonthlyTotals) 
      { 
       <th>@Html.DisplayFor(model => monthlyTotal.Date)</th> 
      } 
     } 
    </tr> 

    @foreach (var item in Model) 
      { 
     <tr> 
      <td>@item.Client.Id</td> 
      <td>@item.Client.Name </td> 
      <td>@item.GrandTotal</td> 

     @foreach (var monthlyTotal in item.MonthlyTotals) 
     { 
      <td>@Html.DisplayFor(model => monthlyTotal.Date)</td> 
      <td>@monthlyTotal.Amount</td> 
     } 
     </tr> 
    } 

</table> 

который выглядит при визуализации

Текущий Rendered Вид1: enter image description here

Im изо всех сил, чтобы получить это правильно отобразить.

Любая помощь будет действительно было оценено

+0

Первое, что вам нужно сделать, это удалить ' @ Html.DisplayFor (модель => monthlyTotal.Date)' в 2 'foreach' блок –

+0

Привет, Стивен. Абсолютно. Я только оставил его там, чтобы помочь мне посмотреть, какая дата месячной модели, поэтому я могу попытаться выяснить, как структурировать представление. –

+0

Итак, что вы пытаетесь сделать? Вы показали 2 изображения, которые вообще не имеют отношения друг к другу. Если последнее изображение является «реальным» данным, то какова должна быть ваша таблица? –

ответ

1

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

Предполагая, что ваш метод принимает параметры для STARTDATE и количества месяцев, отображаемых в таблице, то код будет

public ActionResult StatementSummary(DateTime startDate, int months) 
{ 
    // Get the start and end dates 
    startDate = new DateTime(startDate.Year, startDate.Month, 1); // ensure first day of month 
    DateTime endDate = startDate.AddMonths(months + 1); 
    // Initialize the model 
    List<StatementSummaryVM> model = new List<StatementSummaryVM>(); 
    // Filter the data and group by client 
    var data = db.InvoiceItems 
     .Where(i => i.ItemDate >= startDate && i.ItemDate < endDate) 
     .GroupBy(i => i.Invoice.LegalFile.Client); 
    // Create a StatementSummaryVM for each client group 
    foreach(var clientGroup in data) 
    { 
     StatementSummaryVM summary = new StatementSummaryVM(startDate, months) 
     { 
      Client = clientGroup.Key, 
      GrandTotal = clientGroup.Sum(x => x.AmountInclVAT) 
     }; 
     // Group by month/year 
     foreach(var monthGroup in clientGroup.GroupBy(x => new { Month = x.Date.Month, Year = x.Date.Year })) 
     { 
      // Get the index of the month 
      int index = ((monthGroup.Key.Year - startDate.Year) * 12) + monthGroup.Key.Month - startDate.Month; 
      summary.MonthlyTotals[index].Amount = monthGroup.First().AmountInclVAT; // or .Sum(m => m.AmountInclVAT) if there are multiple invoives per month 
     } 
     model.Add(summary); 
    } 
    return View(model); 
} 

А затем измените StatementSummaryVM модель, чтобы добавить конструктор, который инициализирует коллекцию

public class StatementSummaryVM 
{ 
    public StatementSummaryVM(DateTime startDate, int months) 
    { 
     MonthlyTotals = new List<MonthlyTotalsVM>(); 
     for (int i = 0; i < months; i++) 
     { 
      MonthlyTotals.Add(new MonthlyTotalsVM() { Date = startDate.AddMonths(i) }); 
     } 
    } 
    ..... 
} 
+0

Большое спасибо Стивену. Я сделал несколько изменений, так как у меня есть список элементов счета, которые будут суммироваться в счете-фактуре, но в противном случае ваше решение было на месте! Я не знаю, как вы это делаете, но вы что-то еще. Спасибо ! –