【问题标题】:500 (Internal Server Error) with jQueryjQuery 的 500(内部服务器错误)
【发布时间】:2015-07-25 04:09:01
【问题描述】:

我试图让一个人使用 jQuery 和 AJAX 从他们的购物车中删除物品。每当我单击链接删除项目时,我都会收到 500 内部服务器错误。这是我的代码:

@model AccessorizeForLess.ViewModels.OrderDetailViewModel

@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
    }
<script type="text/javascript">
    $(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("/Orders/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>
<h3>
    <em>Review</em> your cart:
</h3>
@*<p class="button">
    @Html.ActionLink("Checkout
>>", "AddressAndPayment", "Checkout")
</p>*@
<div id="update-message">
</div>
<table>
    <tr>
        <th>
            Product Name
        </th>
        <th>&nbsp;</th>
        <th>
            Price (each)
        </th>
        <td>&nbsp;</td>
        <th>
            Quantity
        </th>
        <th></th>
    </tr>
    @foreach (var item in Model.OrderItems)
    {
        <tr id="row-@item.ProductId">
            <td>
                @Html.ActionLink(item.Product.ProductName, "Details", "Products", new { id = item.ProductId }, null)
            </td>
            <td>&nbsp;</td>
            <td>
                @item.ProductPrice
            </td>
            <td>&nbsp;</td>
            <td id="item-count-@item.ProductQuantity">
                @item.ProductQuantity
            </td>
            <td>&nbsp;</td>
            <td>
                <a href="#" class="RemoveLink" data-id="@item.ProductId">Remove</a>
            </td>
        </tr>
    }
    <tr>
        <td>
            Total
        </td>
        <td></td>
        <td></td>
        <td id="cart-total">
            @Model.OrderTotal
        </td>
    </tr>
</table>

编辑

这是控制器中删除方法的代码:

[HttpPost]
public ActionResult RemoveFromCart(int id)
{
    // Remove the item from the cart
    var cart = ShoppingCart.GetCart(this.HttpContext);

    // Get the name of the product to display confirmation
    string productName = db.OrderItems
        .FirstOrDefault(item => item.ProductId == id).Product.ProductName;

    // Remove from cart
    int itemCount = cart.RemoveFromCart(id);

    // Display the confirmation message
    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);
}

这是上一个方法中引用的RemoveFromCart的代码:

public int RemoveFromCart(int id)
{
    // Get the cart
    var cartItem = entities.Orders.FirstOrDefault(
        c => c.OrderGUID == ShoppingCartId
        && c.OrderItems.Where(p => p.ProductId == id).FirstOrDefault().ProductId == id);

    int itemCount = 0;
    int? cartItemConut = cartItem.OrderItems.Where(p => p.ProductId == id).FirstOrDefault().ProductQuantity;
    if (cartItem != null)
    {
        if (cartItemConut > 1)
        {
            cartItemConut--;
            itemCount = (int)cartItemConut;
        }
        else
        {
            OrderItem oi = cartItem.OrderItems.Where(x => x.ProductId == id).FirstOrDefault();
            entities.OrderItems.Remove(oi);
        }
        // Save changes
        entities.SaveChanges();
    }
    return itemCount;
}

这是 ShoppingCartRemoveViewModel

的代码
using System.ComponentModel.DataAnnotations;

namespace AccessorizeForLess.ViewModels
{
    public class ShoppingCartRemoveViewModel
    {
        public string Message { get; set; }
        [DisplayFormat(DataFormatString = "{0:C}")]
        public decimal CartTotal { get; set; }
        public int CartCount { get; set; }
        public int ItemCount { get; set; }
        public int DeleteId { get; set; }
    }
}

如果您需要更多,请告诉我

【问题讨论】:

  • 在请求中检查控制台 (f12) 并告诉我们,无论如何这是服务器端(权限)
  • 控制台中只显示 500(内部服务器错误)
  • 您确实需要查看您的服务器端日志。
  • @jmar777 服务器端日志在哪里?
  • 500 几乎总是因为您的控制器方法正在抛出异常。您需要显示您的控制器方法。您还可以使用浏览器工具查看详细信息(检查“网络”选项卡)

标签: jquery asp.net-mvc-5


【解决方案1】:

这是一个权限错误,进入并授予 ASPNET 帐户对控制器文件夹的权限,错误就消失了。

【讨论】:

    【解决方案2】:

    500 服务器错误意味着您的代码中存在异常。我从您的代码中猜测 caritem 或 oi(orderitem) 为空,而您正试图对它们进行 LINQ 查询。在尝试进行查询之前先检查它们是否为空。

    【讨论】:

      猜你喜欢
      • 2019-12-10
      • 2013-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-10
      • 2019-01-17
      相关资源
      最近更新 更多