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


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.