如何计算产品总和

时间:2019-02-18 16:48:16

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

我有一个Action,ViewModel可以显示按ProductName分组的全部产品。但这并不能告诉我每个部门有多少人。

假设我在IT部门有20台计算机,在行政部门有10台计算机,那么我的代码显示了我的产品名,即“计算机”。 Totaly withch是30,但不是部门的多少,而行政部门则相同。

与服务器或其他产品相同。

因此,我正在尝试使用此操作来获取每个部门的产品数量。我知道Altteady部门的ID和那些部门并不是动态填充的。

//这在我的HomeController中,这是我试图获取每个部门的总和的动作

?

我想在此ViewModel中调用“ GetStatusOfDepartments”操作,但这使我为null。你能帮我个忙吗 在这个ViewModel中调用动作?

[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");
    }
}

2 个答案:

答案 0 :(得分:0)

在@ Html.Action中,第一个参数应该是动作名称,第二个参数应该是控制器名称。您需要更改代码以使其匹配。

答案 1 :(得分:0)

到目前为止,有几件事与众不同。

  • 看到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>

同样,我不确定您要如何处理状态,但是对于字符串覆盖,您可以像这样在视图中执行,这很好。该视图应处理表示层关注点的各个方面。