【问题标题】:Linq Non-static Methord Requires A TargetLinq 非静态方法需要一个目标
【发布时间】:2014-10-09 02:32:27
【问题描述】:

不知道为什么,但这条线引起了我的问题:

public void AddToCart(Product product)
{
    var cartItem = storeDB.Carts.SingleOrDefault((c.productID) == product.ProductID);
}

我从控制器调用它。

public ActionResult AddToCart(int productID)
{
    var addedProduct = storeDB.Products.Find(productID);

    var cart = ShoppingCart.GetCart(this.HttpContent);

    cart.AddToCart(addedProduct);

    return RedirectToAction("Index");
}

【问题讨论】:

  • 您遇到了什么问题?
  • 请为此提供一些上下文:您是从静态方法调用它吗? ShoppingCartID 是什么?
  • 可能product为空
  • 在你编辑之后,它甚至不会编译,因为c => 已经消失了。
  • 尝试将(c.productID) 替换为c => c.productID。还可以在 LINQ 语句上放置一个断点,并在执行之前确保 product.ProductID 在其中具有有效值。

标签: c# asp.net asp.net-mvc linq


【解决方案1】:

我猜您对storeDB.Products 的第一个查询返回一个空值(因为找不到您要查找的实体)。随后,addedProduct 为空,您尝试在另一个 LINQ 语句中引用它,这会引发空引用异常。

显然,在与您的 storeDB 上下文一起使用的 LINQ 语句中的表达式中抛出空引用异常,表现为您遇到的“方法需要目标”异常。

在将null 传递给AddToCart 方法并在该LINQ 语句中使用它之前,尝试检查它。

public ActionResult AddToCart(int productID)
{
    var addedProduct = storeDB.Products.Find(productID);

    if (addedProduct == null)
    {
        // take some appropriate action here
        // or possibly throw an exception (can't add a missing product to the cart)
    }

    var cart = ShoppingCart.GetCart(this.HttpContent);

    cart.AddToCart(addedProduct);

    return RedirectToAction("Index");
}

此外,您的代码在您第一次编辑后不会编译。您需要重新添加c =>

var cartItem = storeDB.Carts.SingleOrDefault(c => c.productID == product.ProductID);

【讨论】:

    猜你喜欢
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多