Нестатический метод требует целевого
У меня есть действие контроллера, которое отлично работает на 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.CheckConsistency (цель объекта) в System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj, BindingFlags invokeAttr, Binder Binder, Object [], параметры CultureInfo) в System.Reflection.RuntimeMethodInfo.Invoke (Объект obj, BindingFlags invokeAttr, Binder связующее, параметры Object [], CultureInfo culture) в System.Reflection.RuntimePropertyInfo.GetValue(Object obj, Object [] index) в System.Data.Objects.ELinq.QueryParameterExpression.TryGetFieldOrPropertyValue(MemberExpression me, экземпляр объекта, Object & memberValue) в System.Data.Objects.ELinq.QueryParameterExpression.TryEvaluatePath (Выражение выражения, ConstantExpression & constantExpression) в System.Data.Objects.ELinq.QueryParameterExpression.EvaluateParameter(Object [] arguments) в System.Data.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable 1 forMergeOption)
at System.Data.Objects.ObjectQuery
1.GetResults(Nullable 1 forMergeOption) at
System.Data.Objects.ObjectQuery
1.System.Collections.Generic.IEnumerable.GetEnumerator() в System.Linq.Enumerable.FirstOrDefault [TSource] (источник IEnumerable 1 source) at
System.Linq.Queryable.FirstOrDefault[TSource](IQueryable
1) в LandTitle.Controllers.HomeController.MNRefi() в lambda_method (Closure, ControllerBase, Object []) в System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary 2 parameters) at
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext
controllerContext, ActionDescriptor actionDescriptor, IDictionary
2 параметра) в Castle.Proxies.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. & Lt;> c__DisplayClass37. & Lt;> c__DisplayClass39.b__33() в System.Web.Mvc.Async.AsyncControllerActionInvoker. & Lt;> c__DisplayClass4f.b__49() в System.Web.Mvc.Async.AsyncControllerActionInvoker. & Lt;> c__DisplayClass37.b__36 (IAsyncResult asyncResult) в System.Web.Mvc.Async.AsyncControllerActionInvoker. & Lt;> c__DisplayClass25. & Lt;> c__DisplayClass2a.b__20() в System.Web.Mvc.Async.AsyncControllerActionInvoker. & Lt;> c__DysplayRults).
Ответы
Ответ 1
Я думаю, что это запутанное исключение возникает, когда вы используете переменную в лямбда-выражении, которая является нулевой ссылкой во время выполнения. В вашем случае я бы проверил, является ли ваша переменная expressionViewModel пустой ссылкой.
Что-то вроде:
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...
}
}
Ответ 2
Обычно это происходит, когда цель равна нулю. Поэтому лучше сначала проверить вызов, а затем выполнить запрос linq.
Ответ 3
Я нашел эту проблему распространенной в Entity Framework, когда мы создаем экземпляр вручную, а не через DBContext, который разрешит все свойства навигации. Если между таблицами есть ссылки на внешние ключи (свойства навигации), и вы используете эти ссылки в своей лямбда (например, ProductDetail.Products.ID), тогда контекст "Продукты" остается пустым, если вы вручную создали Entity.
Ответ 4
Все ответы указывают на лямбда-выражение с NRE (исключение нулевой ссылки). Я обнаружил, что это также происходит при использовании Linq to Entities. Я подумал, что было бы полезно указать, что это исключение не ограничивается просто NRE внутри лямбда-выражения.
Ответ 5
Я сталкиваюсь с этой ошибкой при тестировании WebAPI в инструменте Почтальон.
После построения кода, если мы удалим какую-либо строку (Например: в моем случае, когда я удаляю одну строку с комментариями, эта ошибка произошла...) в режиме отладки, то Нестатический метод требует целевой"ошибка.
Я снова попытался отправить тот же запрос. На этот раз код работает должным образом. И я правильно получаю ответ в Почтальоне.
Надеюсь это кому-нибудь пригодится...