Нестатический метод требует целевого

У меня есть действие контроллера, которое отлично работает на 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 в инструменте Почтальон.

После построения кода, если мы удалим какую-либо строку (Например: в моем случае, когда я удаляю одну строку с комментариями, эта ошибка произошла...) в режиме отладки, то Нестатический метод требует целевой"ошибка.

Я снова попытался отправить тот же запрос. На этот раз код работает должным образом. И я правильно получаю ответ в Почтальоне.

Надеюсь это кому-нибудь пригодится...