2017-02-24 83 views
-1

我想弄清楚如何在我的购物车视图中申请“运费是第一件商品3.99美元,每件附加商品是0.99美元”。计算ASP.NET MVC中的总发货

现在我有

@{ 
     double itemTotal = 0; 
     double subTotal = 0; 
     int totalQty = 0; 
     double discount = 0.8; 
     double shippingBase = 3.99; 
     double shippingItem = 0.99; 
     double totalShipping = 0; 
} 

@foreach (var item in Model) 
    { 

      double price = (double)item.price/100 * discount; 
      itemTotal = @item.qty * price; 
      subTotal += itemTotal; 
      totalQty += @item.qty; 

我不知道如何处理这一点。我会用一个foreach循环来计算总数量,如果数量大于那个数字,它会加3.99 + 99?

+3

最好在控制器中做这个calc并返回一个合适的ViewModel。不要将视图用​​于业务逻辑 – Steve

+0

运费成本的计算可以在购物车类中完成。 Cart类可以包含IEnumerable类型为的属性Items和ShippingCost属性,其中实现了为运输计算定义的逻辑。然后,您可以在CartViewModel类中定义另一个IEnumerable,以使项目在视图中呈现,使用@foreach和一个类型为decimal的属性ShippingCost来存储运输成本。控制器创建CartViewModel类的实例并设置Items和ShippingCost。 –

+0

收费是根据不同物品还是总量?目前尚不清楚,因为在第一个“项目”之后所述费用不同。但一件物品有数量。 – Nkosi

回答

0

正如我在你的问题的评论中所说的,业务逻辑在视图中没有地方。最好在控制器中执行calc并将结果返回给您的视图的特定模型,或者在简单值的情况下,您可以使用ViewBag将此数据从控制器传输到视图。

在你的情况我会用一个简单的一招

decimal itemTotal = 0m; 
decimal subTotal = 0m; 
int totalQty = 0; 
decimal discount = 0.8m; 
decimal shippingItem = 3.99m; 
decimal totalShipping = 0m; 

foreach (var item in YourEnumerableItems) 
{ 
    decimal price = item.price/100 * discount; 
    itemTotal = item.qty * price; 
    subTotal += itemTotal; 
    totalQty += item.qty; 
    totalShipping += shippingItem; 

    // first shipping cost added, now set it to 0.99m for next items 
    shippingItem = 0.99m; 
} 
ViewBag.Total = subTotal; 
ViewBag.Quantity = totalQty; 
ViewBag.Shipping = totalShipping; 

和视图可以使用ViewBag值的显示使控制器中的钙....

还要注意的是,计算货币值应始终使用小数数据类型以避免rounding errors implicit in the floating point datatype

+0

计算仍然不正确。它不是每个项目添加0.99的附加条款 –

+1

让我明白。第一件商品的运费是3.99,那么第二件商品的0.99是正确的?我建议你使用调试器。在foreach行上放置一个断点(F9),然后运行该应用程序,直到出现断点。此时继续一步一步(F10)并检查循环内部发生了什么。 – Steve