访问来自另一个类的值以在控制器内执行计算

本文关键字:控制器 执行 计算 另一个 访问 | 更新日期: 2023-09-27 18:19:14

我正在使用c#和MVC5做一个web应用程序。我如何使用另一个类的值来做控制器内的计算?例如,我有两个类:Product和Calculation。产品类如下所示:

public class Product
{
    public int Id { get; set; }
    public string ProductName { get; set; }
    public decimal ProductPrice { get; set; }
public virtual ICollection<Calculation> Calculations { get; set; }       
}

计算类是这样的:

public class Calculation
{
    public int Id { get; set; }
    public int ProductId { get; set; }
    public decimal Quantity { get; set; }
    public decimal TotalPrice { get; set; }
    public virtual Product Product { get; set; }
}

因此,当从组合框中选择产品时,我希望该方法使用所选产品的价格(这是类product的属性)和数量(这是类Calculation的属性)来计算TotalPrice。在我的CalculationController中,方法Create是这样的

// GET: Calculation/Create
    public ActionResult Create(int? id)
    {
        ViewBag.ProductId = new SelectList(db.Products, "Id", "ProductName");
        return View();
    }
// POST: Calculation/Create
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Create([Bind(Include = "Id,ProductId,Quantity,TotalPrice")] Calculation calculation)
    {

        if (calculation.TotalPrice == null)
        {
// So this part doesn’t work because it can’t access the value of ProductPrice property from another class.
            calculation.TotalPrice = product.ProductPrice * Quantitiy;
            db.Calculations.Add(calculation);
            await db.SaveChangesAsync();
            return RedirectToAction("Index");
        }

        ViewBag.ProductId = new SelectList(db.Products, "Id", "ProductName", calculation.ProductId);
        return View(calculation);
    }

我意识到我需要初始化它,以便使用另一个类的值,但是有人可以试着解释一下如何在这个例子中做到这一点,因为我经常做一些错误的事情。

谢谢。

访问来自另一个类的值以在控制器内执行计算

从你的代码来看,你正在使用实体框架,并延迟加载一个Product属性到你的计算类(通过使用virtual关键字)。这将使它在您第一次访问它时可用。

但是你的问题是你应该把它作为计算的一个属性来访问,也就是

calculation.TotalPrice = calculation.Product.ProductPrice * Quantitiy;

正如您可能看到的那样,您应该避免访问该产品价格的null异常,因此您应该确保(和/或进行null检查)计算的product属性已被正确初始化。

对于初始化它,你应该在访问它之前做:

calculation.ProductId = productId //The one you're getting in the post

由于这个ProductId属性是我们所说的"外键",因此EF如何使用这些导航属性