Как посчитать сумму продуктов - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть действие ViewModel, которое показывает общее количество товаров, сгруппированных по ProductName.Но это не показывает, сколько в каждом отделе.

Допустим, у меня 20 компьютеров в ИТ-отделе и 10 компьютеров в отделе администрирования, тогда в моем коде отображается название моего продукта, которое называется «Компьютеры».Итого в пределах 30, а не сколько в ИТ-отделе и то же самое для администрации.

И то же самое для серверов или других продуктов.

Поэтому я пытаюсь использовать это действие дляполучить количество продуктов в каждом отделе.Я знаю, что идентификаторы alrteady departemnt и эти отделы не заполнены динамически.

// Это в моем HomeController, и это мое действие, пытаясь получить сумму по каждому отделу

[HttpGet]
public ActionResult GetStatusOfDepartments(int ProductId, int departmentId )
{
    var products = context.Inventory.Where(x => x.ProductId == ProductId && x.departmentId == departmentId).FirstOrDefault();
    if(products != null)
    {
        return Content(products.Status.ToString());
    }
    else
    {
        return Content("No products");
    }
}

И я хочувызвать действие "GetStatusOfDepartments" в этой ViewModel, но это дает мне ноль.Можете ли вы помочь мне, что неправильно называть действие в этой ViewModel?

@model IEnumerable<ProductsInventory.Models.StatusModel>
<table class="table">
    <tr>

        <th>
            Produkt name

        </th>
        <th>
           It-Department

        </th>
        <th>
            Adminstration
        </th>

        <th>
            TotalProducts 

        </th>


    </tr>

    @foreach (var item in Model)
    {
    <tr>

        <td>
            @Html.DisplayFor(modelItem => item.ProductName)
       </td>
        <td>
          // Here I want to call like this
           @Html.Action("GetStatusOfDepartments", "Home", new { ProductId = item.ProductId, departmentId = 1 })
        </td>

        <td>
          // The same Here I want to call like this
           @Html.Action("GetStatusOfDepartments", "Home", new { ProductId = item.ProductId, departmentId = 2 })
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Status)
        </td>


    </tr>
    }

</table>

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Есть несколько вещей, которые отличаются от того, что вы уже сделали.

  • Очень необычно видеть, что 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>

Опять же, я не уверен, что вы пытаетесь сделать со статусом, но для переопределения строк вы можете сделать это в представлении, как это, и это прекрасно.Представление должно обрабатывать различные аспекты проблем на уровне представления.

0 голосов
/ 18 февраля 2019

В @ Html.Action первый параметр должен быть именем действия, а второй параметр должен быть именем контроллера.Вы должны изменить свой код, чтобы соответствовать этому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...