使用 pagedlist 时总计 属性

Get total of property when using pagedlist

我在下面定义了以下代码,我想做的是获取以下属性的总和(ItemsRequireingAttention、NumberOfUrgentItems)。

尽管 Model.Count 告诉我视图模型中有多少个视图模型,但我希望能够获得上述 2 个属性的总数。

我试过使用 Model.TotalCountFor 和 Model.Where,但似乎无法使它们正常工作。我下面的当前代码只会告诉我当前查看的子集的总数。这是可能的还是我必须考虑使用 partials

PortalViewModel

public class PortalViewModel
{
    public Vehicle Vehicle { get; set; }
    public bool MotExpired { get; set; }
    public bool TaxExpired { get; set; }
    public bool MotWithin7Days { get; set; }
    public bool TaxWithin7Days { get; set; }
    public bool MotWithin30Days { get; set; }
    public bool TaxWithin30Days { get; set; }
    public bool MotNotRecorded { get; set; }
    public bool TaxNotRecorded { get; set; }
    public int NumberOfUrgentItems { get; set; }
    public int ItemsRequireingAttention { get; set; }

}

门户控制器

public class PortalController : Controller
{
    public ActionResult Index(int? page)
    {
        var cookie = new HttpCookie("view", "admin"); 
        var portalViewModel = new List<PortalViewModel>();

        var vehicles = db.Vehicles.ToList();

        foreach (var vehicle in vehicles)
        {
            var vm = new PortalViewModel { Vehicle = vehicle };

            if (vehicle.MotDate == null)
            {
                vm.MotNotRecorded = true;
                vm.NumberOfUrgentItems++;
            }
            if (vehicle.TaxDate == null)
            {
                vm.TaxNotRecorded = true;
                vm.NumberOfUrgentItems++;
            }

            if (vehicle.MotDate <= DateTime.Now.AddYears(-1))
            {
                vm.MotExpired = true;
                vm.NumberOfUrgentItems++;
            }
            if (vehicle.TaxDate != null && DateTime.Now.Subtract((DateTime)vehicle.TaxDate).Days >= 7)
            {
                vm.TaxWithin7Days = true;
            }
            else if (vehicle.TaxDate != null && DateTime.Now.Subtract((DateTime)vehicle.TaxDate).Days >= 30)
            {
                vm.TaxWithin30Days = true;
            } 
            portalViewModel.Add(vm);
        }
    }
}

查看

@using Microsoft.Ajax.Utilities
@using PagedList
@using PagedList.Mvc;

@using WebApplication1.ViewModels
@model IPagedList<PortalViewModel>

@{
    ViewBag.Title = "Dashboard";
    var pagedList = (IPagedList)Model;
    var urgentItems = Model.Count(i => i.NumberOfUrgentItems >= 1); //(item => item.NumberOfUrgentItems >= 1);
    int flaggedItems = Model.Count(i => i.ItemsRequireingAttention >= 1);
    int vehicles = Model.Count();

}

<h2>Dashboard</h2>
<hr />
<div class="row">
    @if (urgentItems != 0)
    {
        <div class="col-md-3 col-sm-6 col-xs-6">
            <div class="panel panel-back noti-box">
                <span class="icon-box bg-color-red set-icon">
                    <i class="fa fa-warning"></i>
                </span>
                <div class="text-box">
                    <p class="main-text">@urgentItems Items</p>
                    <p class="text-muted">Requiring immediate action</p>
                </div>
            </div>
        </div>
    }
    @if (flaggedItems != 0)
    {
        <div class="col-md-3 col-sm-6 col-xs-6">
            <div class="panel panel-back noti-box">
                <span class="icon-box bg-color-green set-icon">
                    <i class="fa fa-exclamation"></i>
                </span>
                <div class="text-box">
                    <p class="main-text">@flaggedItems Items</p>
                    <p class="text-muted"><br />Require attention</p>
                </div>

            </div>
        </div>
    }
    <div class="col-md-3 col-sm-6 col-xs-6">
        <div class="panel panel-back noti-box">
            <span class="icon-box bg-color-blue set-icon">
                <i class="fa fa-truck"></i>
            </span>
            <div class="text-box">
                <p class="main-text">@vehicles</p>
                <p class="text-muted"><br />Vehicles in fleet</p>
            </div>
        </div>
    </div>
</div>
<hr />
<div class="row">
    <div class="col-md-12 col-sm-12 col-xs-12">

        <div class="panel panel-default">
            <div class="panel-heading text-center">
                <strong>Current Fleet Details</strong>
            </div>

            <div class="panel-body">
                <div class="table-responsive">
                    <div class="panel  panel-primary">
                        <div class="panel-heading">
                            <h3 class="panel-title text-center">
                                <span class=" ">
                                    Click on the reference number to edit vehicle details
                                </span>
                                <span class="pull-left"><i class="fa fa-info-circle"></i></span>
                                <span class="pull-right"><i class="fa fa-info-circle"></i></span>
                            </h3>
                        </div>
                    </div>
                    <table class="table table-striped table-bordered table-hover">
                        <thead>
                            <tr>
                                <th>@Html.DisplayNameFor(m => m.First().Vehicle.RefNumber)</th>
                                <th>@Html.DisplayNameFor(m => m.First().Vehicle.Make)</th>
                                <th>@Html.DisplayNameFor(m => m.First().Vehicle.Model)</th>
                                <th>@Html.DisplayNameFor(m => m.First().Vehicle.Registration)</th>
                                <th>@Html.DisplayName("Dates")</th>
                            </tr>
                        </thead>
                        <tbody>
                            @foreach (var item in Model)
                            {
                                <tr class='@if (item.MotNotRecorded || item.MotExpired || item.TaxNotRecorded || item.TaxExpired)
                                               {
                                                   @Html.Raw("danger")

                                               } else if (item.MotWithin30Days || item.MotWithin7Days || item.TaxWithin30Days || item.TaxWithin7Days)
                                               {
                                                   @Html.Raw("warning")
                                               }
                                               else
                                               {
                                                   @Html.Raw("success")
                                               }'>
                                    <td>
                                        @if (!item.Vehicle.RefNumber.IsNullOrWhiteSpace() || !string.IsNullOrEmpty(item.Vehicle.RefNumber))
                                        {
                                            @Html.ActionLink(item.Vehicle.RefNumber, "Edit", "Portal", new { @ref = item.Vehicle.RefNumber }, null)
                                        }
                                        else
                                        {
                                            @item.Vehicle.RefNumber
                                        }
                                    </td>
                                    <td>
                                        @item.Vehicle.Make
                                    </td>
                                    <td>
                                        @item.Vehicle.Model
                                    </td>
                                    <td>
                                        @item.Vehicle.Registration
                                    </td>
                                    <td>
                                        @Html.LabelFor(modelItem => item.Vehicle.MotDate):
                                        @{
                                if (item.MotNotRecorded)
                                {
                                    <span class="pull-right text-warning text-uppercase">
                                        <i class="glyphicon glyphicon-warning-sign"></i>
                                        @string.Format("Not yet recorded")
                                    </span>
                                }
                                else
                                {
                                    <span class="pull-right text-success">
                                        @string.Format("{0:dd/MM/yyyy}", item.Vehicle.MotDate) <i class="glyphicon glyphicon-ok"></i>
                                    </span>
                                }
                                        }
                                        <br />
                                        @Html.LabelFor(modelItem => item.Vehicle.TaxDate)
                                        @{
                                if (item.TaxNotRecorded)
                                {
                                    <span class="pull-right text-warning text-uppercase">
                                        <i class="glyphicon glyphicon-warning-sign"></i>
                                        @string.Format("Not yet recorded")
                                    </span>
                                }
                                else
                                {
                                    <span class="pull-right text-success">
                                        @string.Format("{0:dd/MM/yyyy}", item.Vehicle.TaxDate) <i class="glyphicon glyphicon-ok"></i>
                                    </span>
                                }
                                        }
                                    </td>
                                </tr>
                            }
                        </tbody>
                    </table>
                    Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) of @Model.PageCount
                    @Html.PagedListPager(Model, page => Url.Action("Index", new { page }))
                </div>
            </div>
        </div>
    </div>
</div>

您的控制器方法缺少 return 语句,但我假设您要返回 portalViewModel 列表。

我建议创建一个具有 IPagedListPortalViewModel 的 ViewModel,并将您需要的值放在包含的 ViewModel 中。然后您可以在每个项目的视图中使用显示模板。

但是,您也可以创建两个 int 变量并在车辆列表的 foreach 循环中递增它们,然后将它们放入 ViewBag。

public ActionResult Index(int? page)
{
    var cookie = new HttpCookie("view", "admin");
    var portalViewModel = new List<PortalViewModel>();

    var vehicles = db.Vehicles.ToList();

    var totalNumberOfUrgentItems = 0; // first total
    var totalNumberOfItemsRequireingAttention = 0; // second total

    foreach (var vehicle in vehicles)
    {
        var vm = new PortalViewModel { Vehicle = vehicle };

        if (vehicle.MotDate == null)
        {
            vm.MotNotRecorded = true;
            vm.NumberOfUrgentItems++;
        }
        if (vehicle.TaxDate == null)
        {
            vm.TaxNotRecorded = true;
            vm.NumberOfUrgentItems++;
        }

        if (vehicle.MotDate <= DateTime.Now.AddYears(-1))
        {
            vm.MotExpired = true;
            vm.NumberOfUrgentItems++;
        }
        if (vehicle.TaxDate != null && DateTime.Now.Subtract((DateTime)vehicle.TaxDate).Days >= 7)
        {
            vm.TaxWithin7Days = true;
        }
        else if (vehicle.TaxDate != null && DateTime.Now.Subtract((DateTime)vehicle.TaxDate).Days >= 30)
        {
            vm.TaxWithin30Days = true;
        }

        totalNumberOfUrgentItems += vehicle.NumberOfUrgentItems;
        totalNumberOfItemsRequireingAttention += vehicle.ItemsRequireingAttention;

        portalViewModel.Add(vm);
    }

    ViewBag["TotalNumberOfUrgentItems"] = totalNumberOfUrgentItems;
    ViewBag["TotalNumberOfItemsRequireingAttention"] = totalNumberOfItemsRequireingAttention;
    // presumably your return statement is here
}