2017-03-01 13 views
-1

ショッピングカートを構築しており、ショッピングカートにアイテムを追加する方法が成功しています。コントローラへのPOST操作により、Chromeコンソールで「500(内部サーバーエラー)」エラーが発生する

POST http://localhost:62745/ShoppingCart/RemoveFromCart 500 (Internal Server Error) 

ShoppingCartのコントローラーでRemoveFromCart()メソッドを呼び出す必要がありremoveボタンリンクは、JSONオブジェクトを受け取ります。しかし、私は失敗していると、次のエラーを与えているAjax呼び出しを使用していますこれらの項目を削除するにはいくつかのページ要素を更新します。私はこのフォーラムの提案を試みたが、彼らは役に立たない:https://docs.microsoft.com/en-us/aspnet/mvc/overview/older-versions/mvc-music-store/mvc-music-store-part-8

これは、ショッピングカートページ内のJavaScriptである:私はまた、ショッピングカートを構築するため、このチュートリアルに従っhttp://mvcmusicstore.codeplex.com/discussions/244052

<script src="/Scripts/jquery-3.1.1.min.js" 
     type="text/javascript"></script> 
<script type="text/javascript"> 
    $(document).ready(function() { 
     // Document.ready -> link up remove event handler 
     $(".RemoveLink").click(function() { 
      // Get the id from the link 
      var recordToDelete = $(this).attr("data-id"); 
      if (recordToDelete != '') { 
       // Perform the ajax post 
       $.post("/ShoppingCart/RemoveFromCart", { "id": recordToDelete }, 
        function (data) { 
         // Successful requests get here 
         // Update the page elements 
         if (data.ItemCount == 0) { 
          $('#row-' + data.DeleteId).fadeOut('slow'); 
         } else { 
          $('#item-count-' + data.DeleteId).text(data.ItemCount); 
         } 
         $('#cart-total').text(data.CartTotal); 
         $('#update-message').text(data.Message); 
         $('#cart-status').text('Cart (' + data.CartCount + ')'); 
        }); 
      } 
     }); 
    }); 
</script> 

削除リンクは第四<td>列にShoppingCartのページにそれぞれの新しい項目に表示されます。

@foreach (var item in Model.CartItems) 
    { 
     <tr id="[email protected]"> 
      <td> 
       @item.Product.Name 
      </td> 
      <td> 
       @item.Product.Price 
      </td> 
      <td id="[email protected]"> 
       @item.Count 
      </td> 
      <td> 
       <a href="#" class="RemoveLink" data-id="@item.RecordId">Remove</a> 
      </td> 
     </tr> 
    } 

は、次のJavaScriptで呼ばれるべきShoppingCartControllerでRemoveFromCart方法です:

// AJAX: /ShoppingCart/RemoveFromCart/5 
     [HttpPost] 
     public ActionResult RemoveFromCart(int id) 
     { 
      var cart = ShoppingCart.GetShoppingCart(this.HttpContext); 
      var productName = db.Carts.Single(c => c.ProductId == id).Product.Name; 

      int itemCount = cart.RemoveItemFromCart(id); 

      var results = new ShoppingCartRemoveViewModel 
      { 
       Message = Server.HtmlEncode(productName) + 
        " has been removed from your shopping cart.", 
       CartTotal = cart.GetTotal(), 
       CartCount = cart.GetCount(), 
       ItemCount = itemCount, 
       DeleteId = id 
      }; 

      return Json(results); 
     } 
+0

コントローラの動作をデバッグする必要があります。 –

+0

私が想像できる唯一の理由は、あなたのjavascriptがビュー内で混在しているため、配列を作成して単一の値の代わりに配列を渡そうとしているということです 渡されたパラメータですべてが良好で、 jquery .attrはintではなくstringを返すことに注意してください。 ASP.NET MVCデータバインダーで解析する必要があるため、実際には問題になりません。 しかし、渡された値をjqueryでIntに解析したり、メソッドのid型をintからstringの型に変更したりすることができます。 – faint220

+1

'500(内部サーバーエラー)'は、コントローラメソッドが例外をスローしていることを意味します。ブラウザーツール - ネットワークタブ - を使用して、例外の詳細を示す応答を検査します。 –

答えて

0

$.post("/ShoppingCart/RemoveFromCart/", { "id": recordToDelete } 

を変更してみてくださいカートの主キーであるカート・オブジェクトのレコードIDのパラメータを取りますアイテムが削除されました。私は、カートテーブルの商品ID属性であることをメソッドにパラメータを仮定した。

var productName = db.Carts.Single(c => c.ProductId == id).Product.Name;

私はカートテーブルの主キーであること以来c.RecordIdからc.ProductIdを変更し、それは私が製品を入手できるようになります削除されているカートアイテムの名前。

0

あなたはPOSTリクエストのボディの一部としてIDを渡してアクションを呼び出すしようとしているように見えます。アクション// AJAX: /ShoppingCart/RemoveFromCart/5の上にあるコメントを見ると、ルータがURLの一部であると予想していることがわかります。

はRemoveFromCart()method.This方法に誤りがありました

$.post("/ShoppingCart/RemoveFromCart/"+recordToDelete, 
+1

この状況では問題ありません。彼はバインドされたidパラメータの隣の 'FromBody' – faint220

関連する問題