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


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 [], CultureInfo culture) в System.Reflectionvo.Info BindingFlags invokeAttr, связыватель Binder, параметры Object [], культура CultureInfo) в System.Reflection.RuntimePropertyInfo.GetValue (объектный объект, индекс Object []) в System.Data.Objects.ELinq.QueryParameterExpression.TryGetFieldOrPropertyValue, MemberExpertyPalue Object & memberValue) в System.Data.Objects.ELinq.QueryParameterExpression.TryEvaluatePath (выражение выражения,1 forMergeOption) at System.Data.Objects.ObjectQuery1.GetResults (Nullable 1 forMergeOption) at System.Data.Objects.ObjectQuery1.System.Collections.Generic.IEnumerable.GetEnumerator () в System.Linq.Enumerable.FirstOrDefault [TSource] ( 1 source) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryableисточник IEnumerable 1) в LandTitle.Controllers.HomeController.MNRefdale (l) , Object []) в System.Web.Mvc.ReflectedActionDescriptor.Execute (ControllerContext controllerContext, IDictionary2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary2 параметра) в Castle.Proxies.Invocations. Castle.Proxies.AsyncControllerActionInvokerProxy.InvokeActionMethod (ControllerContext controllerContext, ActionDescriptor actionDescriptor, параметры IDictionary``2) в System.Web.Mvc.Async.AsyncControllerActionInvoker. <> C__DisplayCync.WW.Clayb_player_player_player_player.dll (> ._____ClayClay.play_Wid.dll) .AsyncControllerActionInvoker. <> C__DisplayClass4f.b__49 () в System.Web.Mvc.Async.AsyncControllerActionInvoker. <> C__DisplayClass37.b__36 (IAsyncResult asyncResult) в System.Web.Mvc.ync.AsyncControllerActionInvoker. <> C__DisplayClass25. <> C__DisplayClass2a.b__20 () в System.Web.Mvc.Async.AsyncControllerActionInvoker. <> C__DisplayClass25.b__22 (IAsyncResult asyncResult)


Ответы:


497

Я думаю, что это запутанное исключение возникает, когда вы используете переменную в лямбда-выражении, которая является нулевой ссылкой во время выполнения. В вашем случае я бы проверил, является ли ваша переменная 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...
    }
}

71
+1 Это определенно результат NRE в Where()лямбда-выражении. Отличный ответ; сэкономил мне часы сегодня.
— Гадость

Была та же проблема со значениями, которые не загружались и были установлены из конструктора унаследованных контроллеров, а затем передавались в запрос linq в конструкторе дочернего контроллера и вызывали эту загадочную ошибку!
— Шоусон

3
Я думаю, что причина того, что вы получаете эту ошибку, состоит в том, что лямбда выполняет некоторое отражение во внутренних органах и пытается вызвать метод / свойство объекта, но объект не передается, поэтому он пытается вызвать метод / Свойство вроде статического, но в конечном итоге понимает, что оно не статично. Вот почему вы не получаете простую ссылку на старый объект, не установленную для экземпляра сообщения объекта.
— Разработчик из Мельбурна

Достаточно просто прочитать первое предложение, чтобы решить проблему
— Антуан Пеллетье

33

Обычно это происходит, когда цель нулевая. Поэтому лучше сначала проверить цель invoke, а затем выполнить запрос linq.


5
в моем случае это было исключение нулевой ссылки в предложении
— where

12

Я обнаружил, что эта проблема распространена в Entity Framework, когда мы создаем экземпляр Entity вручную, а не через DBContext, который разрешит все свойства навигации. Если между таблицами есть ссылки на внешние ключи (свойства навигации), и вы используете эти ссылки в своей лямбде (например, ProductDetail.Products.ID), то этот контекст «Продукты» остается пустым, если вы создали сущность вручную.


2

Все ответы указывают на лямбда-выражение с NRE (исключение нулевой ссылки). Я обнаружил, что это также происходит при использовании Linq to Entities. Я подумал, что было бы полезно указать, что это исключение не ограничивается просто NRE внутри лямбда-выражения.


1

Я сталкиваюсь с этой ошибкой при тестировании WebAPI в инструменте Почтальон.

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.