繁体   English   中英

收到错误消息:System.Reflection.TargetException:非静态方法需要一个目标

[英]Receiving error message: System.Reflection.TargetException: Non-static method requires a target

我正在使用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 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;
    }
  }
}

这是视图模型:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace SophicCeramics.Models.Order
{
    public class Cart
    {
    public int ItemCount { get; set; }
    public DateTime Date { get; set; }
    public decimal Total { get; set; }
    public List<OrderLineItem> Items { get; set; }
    public decimal UnitPrice { get; set; }
    public int OrderHeaderId { get; set; }
    public string CustomerId { get; set; }
    public System.DateTime OrderDate { get; set; }
    public bool Paid { get; set; }
    public int OrderLineItemId { get; set; }
    public int ProductId { get; set; }
    public int Quantity { get; set; }
    public int CategoryId { get; set; }
    public int ArtistId { get; set; }
    public string Title { get; set; }
    public decimal Price { get; set; }
    public string ProductArtUrl { get; set; }
    public string ProductArtMain { get; set; }
    public string UserId { get; set; }
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    }
}

这是视图:

@model SophicCeramics.Product
@{ ViewBag.Title = "Cart"; }
<div>
<h4>Product</h4>
<hr />
<dl class="dl-horizontal">
    <dt>
        @Html.DisplayNameFor(model => model.Title)
    </dt>
    <dd>
        @Html.DisplayFor(model => model.Title)
    </dd>
    <dt>
        @Html.DisplayNameFor(model => model.Price)
    </dt>
    <dd>
        @Html.DisplayFor(model => model.Price)
    </dd>
    <dt>
        @Html.DisplayNameFor(model => model.ProductArtUrl)
    </dt>
    <dd>
        @Html.DisplayFor(model => model.ProductArtUrl)
    </dd>
    <dt>
        @Html.DisplayNameFor(model => model.ProductArtMain)
    </dt>
    <dd>
        @Html.DisplayFor(model => model.ProductArtMain)
    </dd>
    <dt>
        @Html.DisplayNameFor(model => model.Artist.Name)
    </dt>
    <dd>
        @Html.DisplayFor(model => model.Artist.Name)
    </dd>
    <dt>
        @Html.DisplayNameFor(model => model.Category.Name)
    </dt>
    <dd>
        @Html.DisplayFor(model => model.Category.Name)
    </dd>
</dl>
</div>
<p>
@Html.ActionLink("Edit", "Edit", new { id = Model.ProductId }) |
@Html.ActionLink("Back to List", "Index")
</p>

视图具有自动的布局页面。 我不断收到错误指向以下代码行:

var customer = _context.Customers
        .Include(c => c.OrderHeaders.Select(o => o.OrderLineItems.Select(i => i.Product))).
        FirstOrDefault(c => c.UserId.Equals(user.Id));

无论我如何重新排列include语句,它都将不起作用。 同样,该控制器继承自另一个名为BaseController的控制器,该控制器通过_context与数据库建立连接。 我还尝试从edmx的.tt文件中的相关类中添加几乎所有内容,但仍然会收到错误消息。 另外,当我在客户变量上设置一个断点并逐步执行时,它会直接转到BaseController中的dispose方法。

我猜该user为null,因此在这里的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为null时如何处理,如下所示

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM