计算asp.net mvc中视图中的项目数

本文关键字:视图 项目数 mvc asp net 计算 | 更新日期: 2023-09-27 18:24:00

我是asp.net开发的新手。在我的asp.net mvc项目中,我有一个模型"Employee",我将"Employer"模型的列表传递给RAZOR视图,我试图统计不同类型的员工并显示摘要。

,我的看法是这样的

@{
    int available = 0;
    int onLeave = 0;
    int away = 0;
    int unAvailable = 0;
}
@foreach (var employee in Model){
  <lable>@employee.Name</lable></br>
   @if (@employee.Available){
      @available=available+1;
  }
   @if (@employee.Unavailable){
      @unAvailable=unAvailable;
  }
   @if (@employee.Away){
      @away=away+1;
  }
   @if (@employee.Onleave){
       @onLeave=onLeave+1;
  }
}
    <div>
        <!--additional summary is displayed here-->
        <label>Available:</label>@available
        <label>Unavailable:</label>@unAvailable
        <label>Away:</label>@away
        <label>On Leave:</label>@onLeave
    </div>

但当我运行我的项目变量"available"、"unAvailable"、"away"answers"onLeave"时,它们不会得到更新。

我确信这个列表不是空的,因为显示的是员工的名字。有人能向我解释一下这里发生了什么,以及做的正确方法吗

计算asp.net mvc中视图中的项目数

在传递到视图之前,您应该在外部执行此操作,就像我在原始评论中提到的那样。您可以创建一个名为ViewModel的新对象,以完全按照您希望的方式在页面上表示数据。所以我创建了一个简单的例子,我只使用了您在CSHTML页面中显示的Employee的4个属性。在您的视图中,如果您说您的模型是Employee的列表、数组或其他任何内容,请将其更改为EmployeeViewModel。然后在您的控制器中获取员工列表,将其设置为Employee ViewModel的employees属性。

public class EmployeeViewModel
{
    public IEnumerable<Employee> Employees { get; set; }
    public int TotalAvailable { get { return Employees.Count(emp => emp.Available); } }
    public int TotalUnavailable { get { return Employees.Count(emp => emp.Unavilable); } }
    public int TotalAway { get { return Employees.Count(emp => emp.Away); } }
    public int TotalOnLeave { get { return Employees.Count(emp => emp.OnLeave); } }
}
public class Employee
{
    public bool Available { get; set; }
    public bool Unavilable { get; set; }
    public bool Away { get; set; }
    public bool OnLeave { get; set; }
}
//In the controller do this.
public ActionResult Index() //use your controller Action Name here
{
    var employeeViewModel = new EmployeeViewModel { Employees = /*Your list of empoyees you had as a Model before here*/}
    return View(employeeViewModel)
}

将您的CSHTML代码更改为以下内容:

@foreach(var employee in Model.Employees)
{
  <label> @employee.Name </label></br>
}
    <div>
        <!--additional summary is displayed here-->
        <label> Available:</label> @Model.TotalAvailable
        <label> Unavailable:</label> @Model.TotalUnavailable
        <label> Away:</label> @Model.TotalAway
        <label> On Leave:</label> @Model.TotalOnLeave
    </div>

一种简单快捷的方法是:

<div>
    <!--additional summary is displayed here-->
    <label>Available:</label>@Model.Count(i => i.Available)<br>
    <label>Unavailable:</label>do the same.
    <label>Away:</label>do the same.
    <label>On Leave:</label>do the same.
</div>

请确保模型已经是"ToList()",否则可能会导致对数据库的多次访问。

基本上,我只在需要向视图传递1个以上的模型时才使用viewmodel。在这种情况下不值得。

在View中进行此类计算被视为不良做法

在您的情况下,更好的选择是创建具有相应属性的ViewModel,然后将其传递给模型,之前使用LINQ计算控制器中每种类型的计数。在那里你可以引用你的类型,比如Model.available, Model.away等等。使用ViewModel是MVC的最佳实践。

@Thorarins的答案向您展示了如何在代码中使用LINQ来为您的类型计算计数。

更新:您可以使用JS,但不应该使用,因为它仍然不是View中应该发生的事情。不应在视图中处理对数据的处理。不要被ViewModels吓到,它们并不像看上去那么难。请阅读这篇文章,它考虑了将数据传递给View的所有方法,其中有关于如何创建和传递ViewModel的好例子。

Mvc关于如何做到这一点的示例:

你需要一个型号级

public class EmployeeModel
{
        public int Available {get; set;}
        public int OnLeave  {get; set;}
        public int Away {get; set;}
        public int UnAvailable  {get; set;}
}

和一个命令:

  public ActionResult Index()
  {
    var model = new EmployeeModel();
    model.Available = employee.count(e=> e.available);
    model.OnLeave = employee.count(e=> e.onLeave);
    model.Away = employee.count(e=> e.away);
    model.UnAvailable = employee.count(e=> e.unAvailable );
    return View(model);
  }

和视图

@model EmployeeModel
   <div>
        <!--additional summary is displayed here-->
        <label>Available:</label>@Model.Available
        <label>Unavailable:</label>@Model.UnAvailable
        <label>Away:</label>@Model.Away
        <label>On Leave:</label>@Model.OnLeave
   </div>