非静态方法需要目标

问题描述 投票:204回答:5

我有一个控制器动作,可以在本地和生产中使用Firefox,在本地使用IE,但在生产中不是IE。这是我的控制器动作:

public ActionResult MNPurchase()
{
    CalculationViewModel calculationViewModel = (CalculationViewModel)TempData["calculationViewModel"];

    decimal OP = landTitleUnitOfWork.Sales.Find()
        .Where(x => x.Min >= calculationViewModel.SalesPrice)
        .FirstOrDefault()
        .OP;

    decimal MP = landTitleUnitOfWork.Sales.Find()
        .Where(x => x.Min >= calculationViewModel.MortgageAmount)
        .FirstOrDefault()
        .MP;

    calculationViewModel.LoanAmount = (OP + 100) - MP;
    calculationViewModel.LendersTitleInsurance = (calculationViewModel.LoanAmount + 850);

    return View(calculationViewModel);
}

这是我在IE中获得的堆栈跟踪:

错误。处理您的请求时发生错误。 System.Reflection.TargetException:非静态方法需要一个目标。 System.Reflection.RuntimeMethodInfo.Invoke的System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj,BindingFlags invokeAttr,Binder binder,Object []参数,CultureInfo文化)中的System.Reflection.RuntimeMethodInfo.CheckConsistency(Object target)处于System.Reflection.RuntimeMethodInfo.Invoke(Object obj, System.Data.Objects.ELinq.QueryParameterExpression.TryGetFieldOrPropertyValue(MemberExpression me,Object instance,System.Reflection.RuntimePropertyInfo.GetValue(Object obj,Object [] index)中的BindingFlags invokeAttr,Binder binder,Object []参数,CultureInfo文化) System.Data.Objects.ELinq.ELinqQueryState上的System.Data.Objects.ELinq.QueryParameterExpression.EvaluateParameter(Object [] arguments)中的System.Data.Objects.ELinq.QueryParameterExpression.TryEvaluatePath(Expression expression,ConstantExpression&constantExpression)中的Object&memberValue) .GetExecutionPlan(Nullable1 forMergeOption) at System.Data.Objects.ObjectQuery1.GetResults(System.Linq.Enumerable中的Nullable1 forMergeOption) at System.Data.Objects.ObjectQuery1.System.Collections.Generic.IEnumerable.GetEnumerator())。在Castle.Proxies的System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext,IDictionary1 source) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable2参数)的lambda_method(Closure,ControllerBase,Object [])的LandTitle.Controllers.HomeController.MNRefi()中的FirstOrDefault [TSource](IEnumerable2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary1源代码) .Invocations.ControllerActionInvoker_InvokeActionMethod.InvokeMethodOnTarget()在Castle.DynamicProxy.AbstractInvocation.Proceed()在Glimpse.Mvc3.Interceptor.InvokeActionMethodInterceptor.Intercept(IInvocation调用)在Castle.DynamicProxy.AbstractInvocation.Proceed()在Castle.Proxies.AsyncControllerActionInvokerProxy.InvokeActionMethod (ControllerContext controllerContext,ActionDescriptor actionDescriptor,IDictionary``2参数)在System.Web.Mvc.Async.AsyncControllerActionInvoker。<> c__DisplayClass37。<> c__DisplayClass39.b__33()at System.Web.Mvc.Async.AsyncControllerActionInvoker。<> c__DisplayClass4f。 b__49()在System.Web.Mvc.Async.AsyncControllerActionInvoker。<> c__DisplayClass37.b_ _36(IAsyncResult asyncResult)在System.Web.Mvc.Async.AsyncControllerActionInvoker。<> c__DisplayClass25。<> c__DisplayClass2a.b__20()在System.Web.Mvc.Async.AsyncControllerActionInvoker。<> c__DisplayClass25.b__22(IAsyncResult asyncResult)

c# asp.net-mvc asp.net-mvc-3 entity-framework entity-framework-5
5个回答
460
投票

我认为在lambda中使用变量时会发生这种令人困惑的异常,该变量在运行时是一个空引用。在您的情况下,我会检查您的变量calculationViewModel是否为空引用。

就像是:

public ActionResult MNPurchase()
{
    CalculationViewModel calculationViewModel = (CalculationViewModel)TempData["calculationViewModel"];

    if (calculationViewModel != null)
    {
        decimal OP = landTitleUnitOfWork.Sales.Find()
            .Where(x => x.Min >= calculationViewModel.SalesPrice)
            .FirstOrDefault()
            .OP;

        decimal MP = landTitleUnitOfWork.Sales.Find()
            .Where(x => x.Min >= calculationViewModel.MortgageAmount)
            .FirstOrDefault()
            .MP;

        calculationViewModel.LoanAmount = (OP + 100) - MP;
        calculationViewModel.LendersTitleInsurance = (calculationViewModel.LoanAmount + 850);

        return View(calculationViewModel);
    }
    else
    {
        // Do something else...
    }
}

28
投票

通常在目标为空时发生。因此,首先检查调用目标然后执行linq查询。


12
投票

我发现当我们手动实例化实体而不是通过将解析所有导航属性的DBContext时,这个问题在实体框架中很普遍。如果表之间存在外键引用(导航属性),并且您在lambda中使用这些引用(例如ProductDetail.Products.ID),那么如果您手动创建实体,那么“Products”上下文将保持为null。


2
投票

所有答案都指向带有NRE的Lambda表达式(空引用异常)。我发现使用Linq to Entities时也会发生这种情况。我认为指出此异常不仅限于Lambda表达式中的NRE也是有帮助的。


1
投票

我在Postman工具中测试Web API时遇到此错误。

在构建代码之后,如果我们在调试模式中删除任何行(例如:在我的情况下当我删除一个Commented行时发生此错误...),那么将出现“非静态方法需要目标”错误。

我再次尝试发送相同的请求。这段时间代码工作正常。我在Postman中得到了正确的答复。

我希望它会用到某人......

© www.soinside.com 2019 - 2024. All rights reserved.