Нестатичний метод вимагає цілі


238

У мене є дія контролера, яка добре працює на 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 [] Parametri BindingFlags invokeAttr, Binder binder, Object [] параметри, культураInfo культура) на System.Reflection.RuntimePropertyInfo.GetValue (Object obj, Object [] індекс) у System.Data.Objects.ELinq.QueryParameterExpression.TryGetFieleOelePeerPeerPeerPeerPeerPeerPeerExPeerPeerPeerPeerPeerSeetFeelExExExExExExExExExExExEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEXEEXXX.FetFegs Object & memberValue) на System.Data.Objects.ELinq.QueryParameterExpression.TryEvaluatePath (Вираз виразів,1 forMergeOption) at System.Data.Objects.ObjectQuery1.GetResults (Nullable 1.System.Collections.Generic.IEnumerable.GetEnumerator 1 forMergeOption) at System.Data.Objects.ObjectQuery() у System.Linq.Enumerable.FirstOrDefault [TSource] (Iumumerable 1 source) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable1 source) у LandTitle.Controllers.HomeController.MNRefi () на lambda Controll () , Object []) в System.Web.Mvc.ReflectedActionDescriptor.Execute (ControllerContext controllerContext, IDictionary2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary2 параметри) у Castle.Proxies.Invocations.ControllerActionInvoker_InvokeActionMethod.InvokeMethodOnTarget () у Castle.DynamicProxy.Ab абстрактInvocation.Proceed () на Glimpse.Mvc3.Interceptor.InvokeActionMethodIntercept.Inycation.Incecation.Intercation.Intercept.Intercept.Intercept Castle.Proxies.AsyncControllerActionInvokerProxy.InvokeActionMethod (Контролер ControllerContextContext, ActionDescriptor actionDescriptor, параметри IDScript``2) на System.Web.Mvc.Async.AsyncControllerActionInvoker. <> C__DisplayClass.M39 (My__CisssClass. .AsyncControllerActionInvoker. <> C__DisplayClass4f.b__49 () у System.Web.Mvc.Async.AsyncControllerActionInvoker. <> C__DisplayClass37.b__36 (IAsyncResult asyncResult) на System.Web.Mvc.A.AsyncControllerActionInvoker. <> C__DisplayClass25. <> C__DisplayClass2a.b__20 () на System.Web.Mvc.Async.AsyncControllerActionInvoker. <> C__DisplayClass25.b__22 (IAsyncResult asyncResult)


Відповіді:


497

Я думаю, що цей заплутаний виняток виникає, коли ви використовуєте змінну в лямбда, яка є нульовою посиланням під час виконання. У вашому випадку я перевірив би, чи є ваш змінний обчисленняViewModel нульовим посиланням.

Щось на зразок:

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

71
+1 Це безумовно результат NRE в Where()лямбдаському виразі. Чудова відповідь; сьогодні врятували мене години.
— Юк

Якщо у вас була така ж проблема зі значеннями, які не завантажуються, а встановлюються від успадкованого конструктора контролерів, а потім передаються в запит linq в конструкторі дочірнього контролера і видають цю таємничу помилку!
— Shawson

3
Я думаю, що причина, по якій ви отримуєте цю помилку, полягає в тому, що Lambda робить деяке відображення у внутрішніх справах і намагається викликати метод / властивість на об'єкті, але об'єкт не передається, тому він намагається викликати метод / властивість на зразок статична, але вона врешті-решт усвідомлює, що вона не є статичною. Ось чому ви не отримуєте звичайну стару посилання на об'єкт, не встановлену на екземпляр об'єктного повідомлення.
— Розробник Melbourne

Достатньо лише прочитати перше речення, щоб вирішити проблему
— Антуан Пелтьє

33

Зазвичай це відбувається, коли ціль є нульовим. Тому краще спочатку перевірити ціль виклику, а потім виконати запит linq.


5
в моєму випадку це було нульовим посиланням на виключення в пункті де
— BraveNewMath

12

Я вважав, що ця проблема є поширеною в Entity Framework, коли ми створюємо об'єкт вручну, а не через DBContext, який вирішить усі властивості навігації. Якщо між таблицями є посилання іноземних ключів (властивості навігації), і ви використовуєте ці посилання у вашій лямбда (наприклад, ProductDetail.Products.ID), тоді контекст "Продукти" залишається недійсним, якщо ви вручну створили сутність.


2

Усі відповіді вказують на вислів Лямбда з NRE (Null Reference Exception). Я виявив, що це також виникає при використанні Linq Entities. Я подумав, що було б корисно зазначити, що цей виняток не обмежується лише NRE всередині висловлювання лямбда.


1

Я зіткнувся з цією помилкою при тестуванні WebAPI в інструменті Postman.

Після побудови коду, якщо ми видалимо будь-який рядок ( Наприклад, у моєму випадку, коли я видаляю один коментований рядок, ця помилка сталася ... ) в режимі налагодження, то станеться помилка " Нестатичний метод вимагає цілі ".

Знову я спробував надіслати той самий запит. Цього разу код працює належним чином. І я отримую відповідь належним чином у Postman.

Я сподіваюся, що комусь це стане в нагоді ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.