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


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.