Есть несколько вещей, которые отличаются от того, что вы уже сделали.
- Очень необычно видеть, что ActionResult возвращает Content ().Это означает, что контроллер предоставляет необработанную строку для представления, которое на самом деле не является точкой управления.
- В настоящее время представление имеет
@Html.Action()
запросов, встроенных в цикл, что является большим показателем того, что представление являетсяне предоставлена соответствующая модель. - Заголовок вопроса предполагает, что он больше связан с запросом к базе данных, чем MVC.
- В настоящий момент загрузка одной страницы приведет ко многим запросам к базе данных.Как минимум вдвое больше видов продукции.Лучше всего выполнять как можно меньше запросов к базе данных, поскольку они часто оказывают большое влияние на время, необходимое для загрузки каждой страницы.
В моей попытке ответить на этот вопрос стало очевидно, что существуетотносительно сложный запрос к базе данных, необходимый для создания модели.Возможно, в конечном итоге вы воспользовались описанным выше подходом, чтобы обойти это, поэтому я постараюсь ответить на этот вопрос без сложного запроса к базе данных, при этом придерживаясь шаблонов проектирования MVC (что должно избежать проблем, упомянутых выше)
Создание модели
У вас уже есть довольно хорошее представление о том, что вы хотите отобразить на виде.Он достаточно отличается от моделей баз данных, поэтому мы должны создать новую модель.
public class ProductsInDepartments
{
public int ProductId { get; set; }
public string ProductName { get; set; }
public int ITTotal { get; set; }
public int AdminTotal { get; set; }
public int Status { get; set; }
}
Это просто свойство для каждого столбца в вашем представлении.Я думаю, что у вас есть только два отдела, и их имена не отображаются в базе данных.Если это не правильно, я бы предложил другую модель и подход.
Контроллер
Контроллер должен подготовить модель.В этом случае мы получим все данные, а затем преобразуем их в структуру модели, которая нам нужна:
public enum Departments // Enumerating a database key like this can be helpful if the database itself doesn't describe the numbers in a lookup table or something
{
IT = 1,
Admin = 2
};
[HttpGet]
public ActionResult Status()
{
var Inventory = context.Inventory.ToList(); // Get all records
var ViewModel = new List<Models.ProductsInDepartments>();
foreach (int ProductId in Inventory.Select(e => e.ProductId).Distinct().ToList())
{
ViewModel.Add(new Models.ProductsInDepartments()
{
ProductId = ProductId,
ProductName = Inventory.First(e => e.ProductId == ProductId).ProductName,
AdminTotal = Inventory.Count(e => e.ProductId == ProductId && e.DepartmentId == (int)Department.Admin),
ITTotal = Inventory.Count(e => e.ProductId == ProductId && e.DepartmentId == (int)Department.IT),
Status = Inventory.First(e => e.ProductId == ProductId).Status // I'm not sure what you are trying to do with Status, so you might need to change this
});
}
return View(ViewModel);
}
Представление
Теперь представление очень простое.
@model List<ProductsInventory.Models.ProductsInDepartments>
<table class="table">
<tr>
<th>Product Name</th>
<th>IT Department</th>
<th>Administration</th>
<th>Total Products</th>
</tr>
@foreach (var Item in Model)
{
<tr>
<td>@Model.ProductName</td>
<td>@Model.ITTotal.ToString()</td>
<td>@Model.AdminTotal.ToString()</td>
@if (Model.Status == 0)
{
<td>No Products</td>
}
else
{
<td>@Model.Status</td>
}
</tr>
}
</table>
Опять же, я не уверен, что вы пытаетесь сделать со статусом, но для переопределения строк вы можете сделать это в представлении, как это, и это прекрасно.Представление должно обрабатывать различные аспекты проблем на уровне представления.