访问来自另一个类的值以在控制器内执行计算
本文关键字:控制器 执行 计算 另一个 访问 | 更新日期: 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如何使用这些导航属性