C# 接收错误消息:System.Reflection.TargetException:非静态方法需要目标
我正在使用Visual Studio 2013 Update 2,我的一个控制器中出现了一个未处理的异常,我不知道它来自何处。 这是控制器:C# 接收错误消息:System.Reflection.TargetException:非静态方法需要目标,c#,asp.net-mvc-5,unhandled-exception,C#,Asp.net Mvc 5,Unhandled Exception,我正在使用Visual Studio 2013 Update 2,我的一个控制器中出现了一个未处理的异常,我不知道它来自何处。 这是控制器: using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Threading.Tasks; using System.Web; using System.Web.Mvc; using System.Data.Entity
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using System.Web;
using System.Web.Mvc;
using System.Data.Entity;
using Microsoft.AspNet.Identity;
namespace SophicCeramics.Controllers
{
public class ShopController : BaseController
{
public ActionResult Cart()
{
var order = FindOrCreateOrder();
var m = new Models.Order.Cart(); //
m.Date = order.OrderDate;
m.Total = order.OrderLineItems.Sum(i => i.Quantity * i.UnitPrice);
m.ItemCount = order.OrderLineItems.Count;
m.Items = order.OrderLineItems.ToList();
return View(m);
}
public async Task<ActionResult> AddItem(int productId)
{
var product = _context.Products.FirstOrDefault(p => p.ProductId == productId);
var order = FindOrCreateOrder();
var item = order.OrderLineItems.FirstOrDefault(i => i.ProductId == productId);
if (item != null)
{
item.Quantity++;
await _context.SaveChangesAsync();
}
else
{
item = new OrderLineItem();
item.OrderHeader = order;
item.Product = product;
item.Quantity = 1;
item.UnitPrice = product.Price;
order.OrderLineItems.Add(item);
await _context.SaveChangesAsync();
}
return RedirectToAction("Cart");
}
private OrderHeader FindOrCreateOrder()
{
var UserName = this.User.Identity.Name;
var user = UserManager.FindByName(UserName);
var customer = _context.Customers
.Include(c => c.OrderHeaders.Select(o => o.OrderLineItems.Select(i => i.Product))).
FirstOrDefault(c => c.UserId.Equals(user.Id));
var order = customer.OrderHeaders
.OrderBy(o => o.OrderDate)
.LastOrDefault(o => o.Paid == false);
if(order == null)
{
order = new OrderHeader();
//var Customer = new Customer();
order.Customer = customer;
customer.OrderHeaders.Add(order);
_context.SaveChanges();
}
return order;
}
}
}
无论我如何重新排列include语句,它都不会起作用。
此外,控制器是从另一个名为BaseController的控制器继承的,该控制器通过_上下文连接到数据库。
我还尝试在edmx中的.tt文件中添加几乎所有相关类,但仍然出现错误。
另外,当我在customer变量上放置一个断点并单步执行它时,它会直接进入BaseController中的dispose方法。我猜
user
为空,因此在这里访问lambda表达式中的user.Id
时会出现错误
var customer = _context.Customers
.Include(c => c.OrderHeaders.Select(o => o.OrderLineItems
.Select(i => i.Product)))
.FirstOrDefault(c => c.UserId.Equals(user.Id));
您需要检查此行之后的user
是否为空
var user = UserManager.FindByName(UserName);
当user
不为null时,只执行FindOrCreateOrder
方法中的其余代码。如果else
块中的user
为空,您还需要决定该怎么做,如下所示
private OrderHeader FindOrCreateOrder()
{
var UserName = this.User.Identity.Name;
var user = UserManager.FindByName(UserName);
if (user != null)
{
var customer = _context.Customers
.Include(c => c.OrderHeaders.Select(o => o.OrderLineItems.Select(i => i.Product))).
FirstOrDefault(c => c.UserId.Equals(user.Id));
var order = customer.OrderHeaders
.OrderBy(o => o.OrderDate)
.LastOrDefault(o => o.Paid == false);
if(order == null)
{
order = new OrderHeader();
//var Customer = new Customer();
order.Customer = customer;
customer.OrderHeaders.Add(order);
_context.SaveChanges();
}
return order;
}
else
{
// logic when user is null
}
}
当您得到错误时,
user
null吗?与相同,我非常高兴,因为我已经解决了您帮助@ekad的问题,我甚至没有发现用户是null。一旦我意识到我知道我需要完全重新配置我的逻辑来做我想做的事情。
var customer = _context.Customers
.Include(c => c.OrderHeaders.Select(o => o.OrderLineItems
.Select(i => i.Product)))
.FirstOrDefault(c => c.UserId.Equals(user.Id));
var user = UserManager.FindByName(UserName);
private OrderHeader FindOrCreateOrder()
{
var UserName = this.User.Identity.Name;
var user = UserManager.FindByName(UserName);
if (user != null)
{
var customer = _context.Customers
.Include(c => c.OrderHeaders.Select(o => o.OrderLineItems.Select(i => i.Product))).
FirstOrDefault(c => c.UserId.Equals(user.Id));
var order = customer.OrderHeaders
.OrderBy(o => o.OrderDate)
.LastOrDefault(o => o.Paid == false);
if(order == null)
{
order = new OrderHeader();
//var Customer = new Customer();
order.Customer = customer;
customer.OrderHeaders.Add(order);
_context.SaveChanges();
}
return order;
}
else
{
// logic when user is null
}
}