Für die nicht statische Methode ist ein Ziel erforderlich


238

Ich habe eine Controller-Aktion, die sowohl lokal als auch in der Produktion in Firefox und lokal im IE, aber nicht im IE in der Produktion einwandfrei funktioniert. Hier ist meine Controller-Aktion:

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

Hier ist die Stapelverfolgung, die ich im IE erhalte:

Error. Während Ihrer Anfrage ist ein Fehler aufgetreten. System.Reflection.TargetException: Für eine nicht statische Methode ist ein Ziel erforderlich. at System.Reflection.RuntimeMethodInfo.CheckConsistency (Objektziel) at System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck (Objekt obj, BindingFlags invokeAttr, Binder-Ordner, Object [] -Parameter, CultureInfo-Kultur) at System.Reflection.Ro BindingFlags invokeAttr, Binder Binder, Object [] -Parameter, CultureInfo-Kultur) bei System.Reflection.RuntimePropertyInfo.GetValue (Object obj, Object [] -Index) bei System.Data.Objects.ELinq.QueryParameterExpression.TryGetFieldOrProperty, Object & memberValue) bei System.Data.Objects.ELinq.QueryParameterExpression.TryEvaluatePath (Ausdruck Ausdruck,1 forMergeOption) at System.Data.Objects.ObjectQuery1.GetResults (Nullable 1 forMergeOption) at System.Data.Objects.ObjectQuery1.System.Collections.Generic.IEnumerable.GetEnumerator () bei System.Linq.Enumerable.FirstOrDefault [TSource] (IEnumerable 1 source) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable1-Quelle) bei LandTitle.Controllers.HomeController.MNRefi () bei Clamda_Method , Object []) bei System.Web.Mvc.ReflectedActionDescriptor.Execute (ControllerContext controllerContext, IDictionary2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary2 Parameter) bei Castle.Proxies.Invocations.ControllerActionInvoker_InvokeActionMethod.InvokeMethodOnTarget () bei Castle.DynamicProxy.AbstractInvocation.Proceed () bei Glimpse.Mvc3.Interceptor.InvokeActionMethodInterceptor.InvokeActionMethodInterceptor.Intercept. Castle.Proxies.AsyncControllerActionInvokerProxy.InvokeActionMethod (ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary``2-Parameter) bei System.Web.Mvc.Async.AsyncControllerActionInvoker. <> C__DisplayClass37 .AsyncControllerActionInvoker. <> C__DisplayClass4f.b__49 () bei System.Web.Mvc.Async.AsyncControllerActionInvoker. <> C__DisplayClass37.b__36 (IAsyncResult asyncResult) bei System.Web.Mvc.Async.AsyncControllerActionInvoker. <> C__DisplayClass25. <> C__DisplayClass2a.b__20 () bei System.Web.Mvc.Async.AsyncControllerActionInvoker. <> C__DisplayClass25.b__22 (IAsyncResult asyncResult)


Antworten:


497

Ich denke, diese verwirrende Ausnahme tritt auf, wenn Sie eine Variable in einem Lambda verwenden, die zur Laufzeit eine Nullreferenz ist. In Ihrem Fall würde ich prüfen, ob Ihre Variable berechnungViewModel eine Nullreferenz ist.

Etwas wie:

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 Dies ist definitiv das Ergebnis eines NRE in einem Where()Lambda-Ausdruck. Gute Antwort; hat mir heute Stunden gespart.
Yuck

Hatte das gleiche Problem mit Werten, die nicht geladen und von einem geerbten Controller-Konstruktor festgelegt wurden, dann an eine Linq-Abfrage im Konstruktor eines untergeordneten Controllers übergeben wurden und diesen mysteriösen Fehler auslösten!
Shawson

3
Ich denke, dass der Grund, warum Sie diesen Fehler erhalten, darin besteht, dass das Lambda einige Überlegungen in den Interna anstellt und versucht, eine Methode / Eigenschaft für das Objekt aufzurufen, aber ein Objekt wird nicht übergeben, sodass es versucht, die Methode aufzurufen / Eigenschaft wie es ist statisch, aber es erkennt schließlich, dass es nicht statisch ist. Aus diesem Grund wird die einfache alte Objektreferenz nicht auf eine Instanz einer Objektnachricht festgelegt.
Melbourne Entwickler

Nur den ersten Satz zu lesen, reicht aus, um das Problem zu lösen
Antoine Pelletier

33

Normalerweise passiert es, wenn das Ziel null ist. Überprüfen Sie daher zuerst das aufgerufene Ziel und führen Sie dann die linq-Abfrage durch.


5
In meinem Fall war es eine
Nullreferenzausnahme

12

Ich habe festgestellt, dass dieses Problem im Entity Framework häufig auftritt, wenn wir eine Entität manuell instanziieren und nicht über DBContext, wodurch alle Navigationseigenschaften aufgelöst werden. Wenn zwischen Tabellen Fremdschlüsselreferenzen (Navigationseigenschaften) vorhanden sind und Sie diese Referenzen in Ihrem Lambda verwenden (z. B. ProductDetail.Products.ID), bleibt der Kontext "Produkte" null, wenn Sie die Entität manuell erstellt haben.


2

Alle Antworten verweisen auf einen Lambda-Ausdruck mit einer NRE (Null Reference Exception). Ich habe festgestellt, dass es auch bei der Verwendung von Linq to Entities auftritt. Ich dachte, es wäre hilfreich, darauf hinzuweisen, dass diese Ausnahme nicht nur auf eine NRE in einem Lambda-Ausdruck beschränkt ist.


1

Beim Testen von WebAPI im Postman-Tool tritt dieser Fehler auf.

Wenn wir nach dem Erstellen des Codes im Debugging-Modus eine Zeile entfernen ( Beispiel: In meinem Fall, wenn ich eine kommentierte Zeile entferne, ist dieser Fehler aufgetreten ... ), tritt der Fehler " Nicht statische Methode erfordert ein Ziel " auf.

Wieder habe ich versucht, die gleiche Anfrage zu senden. Dieser Zeitcode funktioniert ordnungsgemäß. Und ich bekomme die Antwort richtig in Postman.

Ich hoffe es wird jemandem nützen ...

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.