2017-02-24 6 views
-1

カートビューでは、「最初の商品には送料が3.99ドル、追加アイテムには$ 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

コントローラでこの計算を行い、適切なViewModelを返します。ビジネスロジックのビューを使用しない – Steve

+0

送料の計算はカートクラスで行うことができます。カートクラスには、タイプIEnumerable のアイテム、配送計算用に定義されたロジックが実装されているShippingCostというプロパティのプロパティを含めることができます。次にCartViewModelクラスで別のIEnumerableを定義して、@foreachを使用してビュー内でアイテムをレンダリングし、配送コストを格納するdecimalタイプのプロパティSh​​ippingCostを定義します。コントローラはCartViewModelクラスのインスタンスを作成し、ItemsおよびShippingCostを設定します。 –

+0

料金は異なる商品または総量に基づいていますか?最初の 'item'の後に記載された料金が違うので、明確ではありません。アイテムには数量があります。 – Nkosi

答えて

0

私はあなたの質問にコメントしたように、ビジネスロジックにはビューがありません。コントローラでcalcを実行し、結果を特定のModelに戻します。単純な値の場合は、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を避けるために10進データ型を使用する必要があります。

+0

計算はまだ間違っています。各項目に追加の0.99を追加していません –

+1

私に教えてください。最初の商品は送料が3.99で、2番目の商品は0.99です。デバッガを使うことをお勧めします。 foreach行にブレークポイント(F9)を置き、ブレークポイントまでそれを実行します。この時点で、ステップ(F10)を繰り返し実行し、ループ内で何が起きているかを確認します。 – Steve