非静态方法需要一个目标

我有一个控制器动作,可以在本地和生产中的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中得到的堆栈跟踪:

< p >错误。 处理请求时发生错误。 非静态方法需要一个目标。在 System.Reflection.RuntimeMethodInfo。CheckConsistency(对象目标)at System.Reflection.RuntimeMethodInfo。InvokeArgumentsCheck(对象obj, BindingFlags invokeAttr, Binder绑定器,对象[]参数,CultureInfo文化)在 System.Reflection.RuntimeMethodInfo。调用对象obj, BindingFlags, invokeAttr, Binder binder,对象[]参数,CultureInfo文化)在 System.Reflection.RuntimePropertyInfo。GetValue(Object obj, Object[] index System.Data.Objects.ELinq.QueryParameterExpression。TryGetFieldOrPropertyValue(MemberExpression me,对象实例,对象&memberValue) System.Data.Objects.ELinq.QueryParameterExpression。TryEvaluatePath(表达式表达式,常量表达式&constantExpression) System.Data.Objects.ELinq.QueryParameterExpression。EvaluateParameter (Object[]参数) 在System.Data.Objects.ELinq.ELinqQueryState。GetExecutionPlan (forMergeOption Nullable <代码> 1) 在System.Data.Objects.ObjectQuery > < /代码1。GetResults(Nullable1 forMergeOption) at System.Data.Objects.ObjectQuery < /代码> 1. system.collections.generic.ienumerable.getenumerator () 在System.Linq.Enumerable。FirstOrDefault[TSource](IEnumerable1 source System.Linq.Queryable。FirstOrDefault[TSource](IQueryable1 source) at landtitle . controllers . homeconcontroller . mnrefi () at lambda_method(闭包,ControllerBase, Object[]) at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext . execute controllerContext, dicictionary 2参数)在 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod (ControllerContext controllerContext, ActionDescriptor ActionDescriptor, IDictionary2个参数)在 castle . agents . invoctions . controlleractioninvoker_invokeactionmethod . invokemethodontarget ( Glimpse.Mvc3.Interceptor.InvokeActionMethodInterceptor。拦截(IInvocation调用)在castle . dynamicproxy . abstractinvoke . proceed()在 Castle.Proxies.AsyncControllerActionInvokerProxy。InvokeActionMethod(ControllerContext ControllerContext, ActionDescriptor ActionDescriptor, IDictionary ' ' 2个参数)at System.Web.Mvc.Async.AsyncControllerActionInvoker灵活;> c__DisplayClass37灵活;> c__DisplayClass39.b__33 () System.Web.Mvc.Async.AsyncControllerActionInvoker灵活;> c__DisplayClass4f.b__49 () System.Web.Mvc.Async.AsyncControllerActionInvoker灵活;> c__DisplayClass37。b__36(IAsyncResult asyncResult) at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass25.<>c__DisplayClass2a.b__20() at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass25. >c__DisplayClass25.<b__22 (IAsyncResult asyncResult) < / p >
298550 次浏览

我认为这种令人困惑的异常发生在使用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...
}
}

通常在目标为空时发生。所以最好先检查调用目标,然后再执行linq查询。

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

我在邮差工具测试WebAPI时遇到了这个错误。

在构建代码之后,如果我们在调试模式中删除任何一行(例如:在我的情况下,当我删除一个注释行的时候,这个错误发生了……),那么 “非静态方法需要一个目标"

再次,我试图发送相同的请求。这个时间代码正常工作 正常。我在Postman中得到正确的响应。

我希望它能用于某人……

所有的答案都指向一个带有NRE(空引用异常)的Lambda表达式。我发现它也发生在使用Linq实体。我认为指出这个异常并不仅限于Lambda表达式中的NRE是有帮助的。

如果你正在使用一个对象为空的GetProperty的反射,就会发生这种情况。

(这是一个关于错误的简单例子)

当Linq查询从DB上下文中获取数据而DB上下文匹配ID为空时发生此错误。 假设:我们根据学生记录(参考表)从数据库中获取校友信息

var getAlumniData = DBContext.Alumni.Where(a => a.AlumniID == loginHistory.AlumniID)
.Select(a => new Alumni
{
Enrollment = a.Student.Enrollment,
RegistrationNo = a.RegistrationNo,
Name = a.Name,
}).SingleOrDefault();

我们从用户登录历史中获取匹配的ID。如果用户登录历史记录为空,则loginHistory. log为空。AlumniID为空。所以它会错误地询问所需的目标是需要的。

对于在运行MS Test [DynamicData] [DataTestMethod]单元测试时遇到错误Non-static method requires a target的任何人,该错误可能是由于没有使您的静态数据测试场景收集static造成的,即确保您有:

public **static** IEnumerable<object[]> MyFakeData =>
new[]
{
new object[] { "Foo" },
new object[] { "Bar" }
};


[DynamicData(nameof(MyFakeData))]
[DataTestMethod]
public void DoMyTests(string someData) {...}

调试非常烦人,因为没有有用的堆栈跟踪