2017-02-23 49 views
-1

如何计算剃刀html中的装运总量。第一件产品的运费为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; 

} 

    @foreach (var item in Model) 
    { 

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

仅供参考,您可能需要考虑将其从视图移到视图模型中。这是一条业务规则,所以将它捆绑到您的视图中意味着您只能使用该视图。您可以使用视图助手,但由于这是一个业务规则,它可能属于模型中的方法或单独的业务逻辑类/等。然后,控制器可以通过提供所需的值来构建视图模型,而视图模型只需显示那里的内容,而无需执行任何计算。只是一个建议。 – Dave

回答

0

您可以添加一个简单的条件,除了你的循环:

@{ 
    double itemTotal = 0; 
    double subTotal = 0; 
    int totalQty = 0; 
    double discount = 0.8; 
    double shippingBase = 3.99; 
    double shippingItem = 0.99; 
    double totalShipping = 0; //used to calculate the cumulative shipping total 
} 

@foreach (var item in Model) 
{ 

    double price = (double)item.price/100 * discount; 
    itemTotal = @item.qty * price; 
    subTotal += itemTotal; 
    totalQty += @item.qty; 
    totalShipping += ((totalShipping >= shippingBase) ? shippingItem : shippingBase); 
} 
+0

我对这个说法感到困惑:totalShipping + = totalShipping> shippingBase? shippingItem:shippingBase; –

+0

这是一个“第三级操作员”:https://msdn.microsoft.com/en-us/library/ty67wk28.aspx。它基本上就像是一个“if”语句,但更简洁。在这个例子中,通过循环(每个项目)的每次迭代,“东西”被添加到'totalShipping'。如果'totalShipping'小于'3.99'(表示这是通过循环的第一次),则'3.99'被添加到'totalShipping'。如果'totalShipping'大于'3.99'(第一项后面的每个附加项),则'shippingItem'('0.99')被添加到'totalShipping'。 –

+0

好吧,我试过了,但它没有增加0.99当它的第二项 –

1

使用此语句

运费是第一项$ 3.99及每个 0.99 $附加项目。

提取以下数据以创建运费模型。

public class ShippingCharge { 
    public decimal basePrice { get; set; } 
    public int baseCount { get; set; } 
    public decimal unitPrice { get; set; } 
} 

使用来自OP的例子会被填充为

//Shipping charges are 
shippingCharge = new ShippingCharge() { 
    // $3.99 
    basePrice = 3.99M, 
    //for the first item 
    baseCount = 1, 
    // $.99 for each additional item. 
    unitPrice = 0.99M 
}; 

做完这些下面的算法来计算给出一个项目计数运费。

decimal? CalculateShippingTotal(int itemCount, ShippingCharge charge) { 
    decimal? total = null; 
    if (charge != null) { 
     var basePrice = charge.basePrice; 
     var baseCount = charge.baseCount; 

     if (itemCount > baseCount) { 
      var qtyDifference = itemCount - baseCount; 
      var additionalCost = qtyDifference * charge.unitPrice; 

      total = basePrice + additionalCost; 
     } else { 
      total = itemCount * basePrice; 
     } 
    } 
    return total; 
} 

以下单元测试验证算法在计算总运费中的正确性。

[TestMethod] 
public void _TotalShipping_For_One_Item() { 
    //Arrange 
    var totalQty = 1; 
    var expected = 3.99M; 

    //Act 
    var actual = CalculateShippingTotal(totalQty, shippingCharge); 

    //Assert 
    actual.ShouldBeEquivalentTo(expected); 
} 

[TestMethod] 
public void _TotalShipping_For_Two_Items() { 
    //Arrange 
    var totalQty = 2; 
    var expected = 4.98M; 

    //Act 
    var actual = CalculateShippingTotal(totalQty, shippingCharge); 

    //Assert 
    actual.ShouldBeEquivalentTo(expected); 
} 

[TestMethod] 
public void _TotalShipping_For_Three_Items() { 
    //Arrange 
    var totalQty = 3; 
    var expected = 5.97M; 

    //Act 
    var actual = CalculateShippingTotal(totalQty, shippingCharge); 

    //Assert 
    actual.ShouldBeEquivalentTo(expected); 
} 

这个答案的目标具体是如何计算基于OP的运输成本而不是折扣的小计。这应该很简单,可以通过计算物品,数量和价格来进行计算。完成后,使用物品数量和费用来计算运费。