计算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"时,它们不会得到更新。
我确信这个列表不是空的,因为显示的是员工的名字。有人能向我解释一下这里发生了什么,以及做的正确方法吗
在传递到视图之前,您应该在外部执行此操作,就像我在原始评论中提到的那样。您可以创建一个名为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>