2017-03-01 37 views
-1

我正在構建一個購物車,並且我有一個將項目添加到ShoppingCart的成功方法。但是,除去這些項目,我使用了Ajax調用它是不成功的,給了以下錯誤:控制器操作的Ajax帖子在Chrome控制檯中出現「500(內部服務器錯誤)」錯誤

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

remove按鈕鏈接應該叫在我的購物控制器的RemoveFromCart()方法,得到一個JSON對象並更新多個頁面元素。我想在這個論壇的建議,但他們不幫助:http://mvcmusicstore.codeplex.com/discussions/244052

我也跟着本教程爲構建購物車:https://docs.microsoft.com/en-us/aspnet/mvc/overview/older-versions/mvc-music-store/mvc-music-store-part-8

這是JavaScript在購物車頁面:

<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>列:

@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> 
    } 

以下是在ShoppingCartController的RemoveFromCart方法應該在JavaScript調用:

// 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。它並不重要,因爲它應該由ASP.NET MVC數據綁定器進行分析。 但是,你可以嘗試使用jquery將傳遞值解析爲Int,或者將方法中的id類型從int更改爲字符串類型。 – faint220

+1

'500(內部服務器錯誤)'表示控制器方法拋出異常。使用瀏覽器工具 - 網絡選項卡 - 檢查將給出例外細節的響應。 –

回答

0

有一個在RemoveFromCart一個錯誤()method.This方法將車對象的的recordId的參數是一車的主鍵項目被刪除。我是假設參數的方法是車表產品屬性:

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

我改變c.ProductIdc.RecordId,因爲是在車表的主鍵,這將讓我獲得產品來自正在移除的購物車項目的名稱。

0

它看起來像你試圖調用傳遞id作爲POST請求的身體的一部分行動。如果您查看動作// AJAX: /ShoppingCart/RemoveFromCart/5上方的評論,則會看到路由器期望它成爲網址的一部分。

嘗試改變

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

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

這種情況並不重要。只有當他在綁定ID參數旁邊有'FromBody' – faint220

相關問題