2015-11-24 6 views
1

Я очень новичок в разработке asp.net. В моем проекте asp.net mvc у меня есть модель «Сотрудник», и я передаю список модели «Сотрудник» в представление RAZOR, и я пытаюсь подсчитать разные типы сотрудников и показать сводку.подсчитайте количество элементов в представлении asp.net mvc

мой взгляд, как это,

@{ 
    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> 

, но когда я запускаю мои переменные проекта «доступны», «Недоступен», «далеко» и «OnLeave» не обновляются.

Я уверен, что этот список не пуст, потому что отображаются имена сотрудников. может кто-нибудь объяснить мне, что происходит здесь и правильный способ сделать это образец

+3

Такая работа не должна происходить в представлении. Представление предназначено исключительно для отображения информации. Ваши расчеты должны проводиться до передачи в представление и готовы к отображению. –

+0

@ Cubicle.Jockey спасибо за быстрый ответ. Я исправлю это. – e11438

ответ

3

Вы должны делать это за пределами перед тем, как перейти к представлению, как я упоминал в своем первоначальном комментарии. Вы можете создать новый объект, называемый ViewModel, для представления данных точно так же, как вы хотите на странице. Поэтому я создал простой пример, я использовал только 4 свойства Employee, которые вы показываете на странице CSHTML. В вашем представлении, где вы сказали, что ваша МОДЕЛЬ - это либо список, либо место, либо что-либо другое из Employee, измените его на EmployeeViewModel. Затем в вашем контроллере, где вы получите список сотрудников, установите их в свойство Employees для Employee ViewModel.

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

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> 
1

Сделать такие расчеты на View рассмотрены a ПЛОХАЯ практика.

В вашем случае лучшим вариантом будет создание ViewModel с соответствующими свойствами, а затем передать его модели, предварительно подсчитав количество для каждого типа контроллера с помощью LINQ. Где вы можете ссылаться на свои типы, такие как Model.available, Model.away и так далее. Использование ViewModel - лучшая практика для MVC.

@Thorarins ответ покажет вам, как использовать LINQ в вашем коде, чтобы рассчитать количество для ваших типов.

ОБНОВЛЕНИЕ: Вы можете использовать JS, но не должны, потому что это все еще не то, что должно произойти в представлении. Работа с данными не должна обрабатываться в представлении. Не бойтесь ViewModels, они не так уж трудны, как могли бы показаться. Пожалуйста, прочитайте this article, в котором рассмотрены все способы передачи данных в View, который имеет хороший пример того, как создавать и передавать ViewModel.

+0

, хотя это плохая практика. есть ли какой-либо другой способ для этого, используя что-то вроде java-скрипта. – e11438

+0

Никогда не говорил ничего о том, где поставить код, просто покажите, как считать его вместо цикла for, и предпочтительной будет модель представления, поскольку другие сценарии разрушат шаблон. – Thorarins

+0

@ e11438 Пожалуйста, прочитайте обновленный ответ. – user2771704

1

простой и быстрый способ:

<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()", или это может привести к множественному доступу к базе данных.

В принципе, я использую только viewmodel, когда мне нужно передать более 1 модели на представление. Не стоит в этом случае.

Смежные вопросы