【问题标题】:count the number of items in view in asp.net mvc计算asp.net mvc中视图中的项目数
【发布时间】:2015-11-24 07:09:39
【问题描述】:

我对asp.net 开发非常陌生。在我的 asp.net mvc 项目中,我有模型“Employee”,我正在将“Employee”模型列表传递给 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”和“onLeave”时,并没有得到更新。

我确定该列表不为空,因为正在显示员工姓名。 有人可以解释一下这里发生了什么以及正确的方法

【问题讨论】:

  • 这种工作不应该在视图中发生。视图纯粹是为了显示信息。您的计算应该在传递到视图之前进行并准备好显示。
  • @Cubicle.Jockey 感谢您的快速回复。我会改正的。

标签: c# asp.net asp.net-mvc asp.net-mvc-4 razor


【解决方案1】:

您应该在传递给我在原始评论中提到的视图之前执行此操作。您可以创建一个名为 ViewModel 的新对象,以完全按照您希望在页面上显示的数据。所以我创建了一个简单的示例,我只使用了您在 CSHTML 页面中显示的 Employee 的 4 个属性。在您说您的模型是列表、数组或任何员工的视图上,将其更改为 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>

【讨论】:

    【解决方案2】:

    一个简单快捷的方法是:

    <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()”,否则可能导致数据库的多访问。

    基本上,当我需要将多个模型传递给视图时,我只使用视图模型。在这种情况下不值得。

    【讨论】:

      【解决方案3】:

      在 View 中进行此类计算被认为是一种不好的做法

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

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

      更新: 你可以使用 JS,但你不应该,因为它仍然不是在 View 中应该发生的事情。不应在 View 中处理数据处理。不要被 ViewModel 吓到,它们并没有看起来那么难。请阅读this article,它考虑了将数据传递给 View 的所有方式,其中有很好的示例如何创建和传递 ViewModel。

      【讨论】:

      • 虽然这是一种不好的做法。有没有其他方法可以使用 java 脚本之类的东西。
      • 从来没有说过将代码放在哪里,只是展示了如何计算它而不是 for 循环,并且当然更喜欢视图模型,因为其他情况会破坏模式
      • @Thorarins 对不起,似乎我误解了你的回答,因此更新了我的。 :)
      【解决方案4】:

      关于如何做的 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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-11
        • 2011-10-01
        • 1970-01-01
        • 2023-03-06
        相关资源
        最近更新 更多