Metoda niestatyczna wymaga celu

238

Mam działanie kontrolera, które działa poprawnie w przeglądarce Firefox zarówno lokalnie, jak i produkcyjnie, a IE lokalnie, ale nie IE w produkcji. Oto moja akcja kontrolera:

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);
}

Oto ślad stosu, który otrzymuję w IE:

Błąd. Podczas przetwarzania żądania wystąpił błąd. System.Reflection.TargetException: Metoda niestatyczna wymaga celu. at System.Reflection.RuntimeMethodInfo.CheckConsistency (Object Object) w System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck (Object obj, BindingFlags invokeAttr, Binder binder, Object [] parametry, CultureInfo culture) w System.Reflection.RuntimevethodInfo. BindingFlags invokeAttr, Binder segregator, parametry Object [], CultureInfo culture) w System.Reflection.RuntimePropertyInfo.GetValue (Object obj, Object [] index) w System.Data.Objects.ELinq.QueryParameterExpression.TryGetFieldOrPropertyValion, instanceE Object & memberValue) w System.Data.Objects.ELinq.QueryParameterExpression.TryEvaluatePath (wyrażenie wyrażenia,1 forMergeOption) at System.Data.Objects.ObjectQuery1.GetResults (Nullable 1.System.Collections.Generic.IEnumerable.GetEnumerator ( 1 forMergeOption) at System.Data.Objects.ObjectQuery) w System.Linq.Enumerable.FirstOrDefault [TSource] (IEnumerable 1 source) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable1 source) w LandTitle.Controllers.HomeController.MNRefi () w lambda_metase , Object []) w System.Web.Mvc.ReflectedActionDescriptor.Execute (ControllerContext controllerContext, IDictionary2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary2 parametry) w Castle.Proxies.Invocations.ControllerActionInvoker_InvokeActionMethod.InvokeMethodOnTarget () w Castle.DynamicProxy.AbstractInvocation.Proceed () w Glimpse.Mvc3.Interceptor.InvokeActionMethodInterceptor.Interceptor.Interceptor. Castle.Proxies.AsyncControllerActionInvokerProxy.InvokeActionMethod (ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary``2 parametry) w System.Web.Mvc.Async.AsyncControllerActionInvoker. <> C__DisplayClass37cebsv. .AsyncControllerActionInvoker. <> C__DisplayClass4f.b__49 () w System.Web.Mvc.Async.AsyncControllerActionInvoker. <> C__DisplayClass37.b__36 (IAsyncResult asyncResult) w System.WebsMc.AsyncControllerActionInvoker. <> C__DisplayClass25. <> C__DisplayClass2a.b__20 () w System.Web.Mvc.Async.AsyncControllerActionInvoker. <> C__DisplayClass25.b__22 (IAsyncResult asyncResult)

użytkownik547794
źródło

Odpowiedzi:

497

Myślę, że ten mylący wyjątek występuje, gdy używasz zmiennej w lambda, która jest zerowym odwołaniem w czasie wykonywania. W twoim przypadku sprawdziłbym, czy twoja zmienna obliczeniaViewModel jest odwołaniem zerowym.

Coś jak:

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...
    }
}
Maarten
źródło
71
+1 Jest to zdecydowanie wynik NRE w Where()wyrażeniu lambda. Świetna odpowiedź; oszczędził mi dziś godziny.
Fuj
Miał ten sam problem z wartościami, które nie ładowały się i były ustawiane przez odziedziczony konstruktor kontrolerów, a następnie były przekazywane do zapytania linq w konstruktorze kontrolera podrzędnego i generowały ten tajemniczy błąd!
Shawson
3
Myślę, że przyczyną tego błędu jest to, że Lambda robi pewne odbicie w wewnętrznych elementach i próbuje wywołać metodę / właściwość na obiekcie, ale obiekt nie jest przekazywany, więc próbuje wywołać metodę Właściwość /, jakby była statyczna, ale ostatecznie zdaje sobie sprawę, że nie jest statyczna. Dlatego nie otrzymujesz zwykłego starego odwołania do obiektu, które nie jest ustawione na wystąpienie komunikatu o obiekcie.
Melbourne Developer
Wystarczy przeczytać pierwsze zdanie, aby rozwiązać problem
Antoine Pelletier
33

Zwykle dzieje się tak, gdy cel jest zerowy. Lepiej więc najpierw sprawdź cel wywoływania, a następnie wykonaj zapytanie linq.

Jim Yu
źródło
5
w moim przypadku był to wyjątek zerowy w klauzuli
where
12

Zauważyłem, że ten problem występuje w Entity Framework, gdy tworzymy instancję ręcznie ręcznie, a nie za pomocą DBContext, który rozwiąże wszystkie właściwości nawigacji. Jeśli między tabelami znajdują się odwołania do klucza obcego (właściwości nawigacji) i używasz tych odwołań w lambda (np. ProductDetail.Products.ID), wówczas kontekst „Produkty” pozostaje pusty, jeśli ręcznie utworzyłeś Encję.

ccherwin
źródło
2

Wszystkie odpowiedzi wskazują na wyrażenie Lambda z NRE (Null Reference Exception). Przekonałem się, że występuje to również podczas korzystania z Linq do jednostek. Pomyślałem, że pomocne byłoby wskazanie, że ten wyjątek nie ogranicza się tylko do NRE w wyrażeniu Lambda.

Nathan
źródło
1

Napotykam ten błąd podczas testowania interfejsu WebAPI w narzędziu Postman.

Po zbudowaniu kodu, jeśli usuniemy dowolną linię ( na przykład: w moim przypadku, gdy usunę jedną linię z komentarzem, ten błąd wystąpił ... ) w trybie debugowania, pojawi się błąd „ Metoda niestatyczna wymaga celu ”.

Ponownie próbowałem wysłać tę samą prośbę. Ten kod czasowy działa poprawnie. I poprawnie otrzymuję odpowiedź w Postman.

Mam nadzieję, że przyda się komuś ...

Shiv
źródło