Il metodo non statico richiede un obiettivo


238

Ho un'azione del controller che funziona bene su Firefox sia localmente che in produzione e IE localmente, ma non IE in produzione. Ecco l'azione del mio controller:

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

Ecco la traccia dello stack che ottengo in IE:

Errore. Si è verificato un errore durante l'elaborazione della richiesta. System.Reflection.TargetException: il metodo non statico richiede una destinazione. at System.Reflection.RuntimeMethodInfo.CheckConsistency (Target oggetto) su System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck (Object obj, BindingFlags invokeAttr, Binder binder, Object [] parametri, CultureInfo culture) su System.Reflection.RuntimeMethodInfo. BindingFlags invokeAttr, Binder binder, Parametri Object [], Cultura CultureInfo) su System.Reflection.RuntimePropertyInfo.GetValue (Object obj, Object [] index) su System.Data.Objects.ELinq.QueryParameterExpression.TryGetFieldOrPropertyValue (MemberExpression Object & memberValue) su System.Data.Objects.ELinq.QueryParameterExpression.TryEvaluatePath (espressione di espressione,1 forMergeOption) at System.Data.Objects.ObjectQuery1.GetResults (Nullable 1 forMergeOption) at System.Data.Objects.ObjectQuery1.System.Collections.Generic.IEnumerable.GetEnumerator () su System.Linq.Enumerable.FirstOrDefault [TSource] ( 1 source) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryablesorgente IEnumerable 1) su LandTitle.Controllers.HomeController.MNRefi () su lambda_metase (Chiusura, ControllerB , Object []) su System.Web.Mvc.ReflectedActionDescriptor.Execute (ControllerContext controllerContext, IDictionary2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary2 parametri) su Castle.Proxies.Invocations.ControllerActionInvoker_InvokeActionMethod.InvokeMethodOnTarget () su Castle.DynamicProxy.AbstractInvocation.Proceed () su Glimpse.Mvc3.Interceptor.InvokeActionMethodIntercept.Procept (II) Castle.Proxies.AsyncControllerActionInvokerProxy.InvokeActionMethod (ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary``2 parametri) su System.Web.Mvc.Async.AsyncControllerActionInvoker. <> C__DisplayCvcDisplayCvcDisplayCvcDisplayCvcDisplayCvcDisplayCvcDisplayCvcDisplayCvcDisplayCvcDisplayCvcDisplayCvcDisplayCvcDisplayCvcDisplayCvcDisplayCvcDisplayCvcDisplayCvcDisplayCvcDisplayCvcDisplayCvcDisplayCvcDisplayCvc .AsyncControllerActionInvoker. <> C__DisplayClass4f.b__49 () su System.Web.Mvc.Async.AsyncControllerActionInvoker. <> C__DisplayClass37.b__36 (IAsyncResult asyncResult) su System.AWc.M.AsyncControllerActionInvoker. <> C__DisplayClass25. <> C__DisplayClass2a.b__20 () su System.Web.Mvc.Async.AsyncControllerActionInvoker. <> C__DisplayClass25.b__22 (IAsyncResult asyncResult)


Risposte:


497

Penso che questa eccezione confusa si verifichi quando si utilizza una variabile in una lambda che è un riferimento null in fase di esecuzione. Nel tuo caso, vorrei verificare se il tuo calcolo di calcoloViewModel è riferimento null.

Qualcosa di simile a:

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 Questo è sicuramente il risultato di un NRE in Where()un'espressione lambda. Bella risposta; mi ha risparmiato ore oggi.
Yuck,

Ha avuto lo stesso problema con i valori che non venivano caricati e impostati da un costruttore di controller ereditato, quindi passati in una query linq nel costruttore di un controller figlio e generando questo misterioso errore!
Shawson,

3
Penso che il motivo per cui si ottiene questo errore sia che Lambda sta riflettendo negli interni e sta cercando di chiamare un metodo / proprietà sull'oggetto, ma un oggetto non viene passato, quindi sta provando a chiamare il metodo La proprietà / come è statica ma alla fine si rende conto che non è statica. Questo è il motivo per cui non si ottiene il semplice riferimento al vecchio oggetto non impostato su un'istanza di un messaggio oggetto.
Melbourne Developer

Basta leggere la prima frase per risolvere il problema
Antoine Pelletier,

33

Normalmente succede quando la destinazione è nulla. Quindi meglio controllare prima il target invoke poi fare la query linq.


5
nel mio caso era un'eccezione di riferimento null nella clausola
where

12

Ho riscontrato che questo problema è prevalente in Entity Framework quando istanziamo un'entità manualmente anziché tramite DBContext che risolverà tutte le proprietà di navigazione. Se tra le tabelle sono presenti riferimenti a chiave esterna (Proprietà di navigazione) e si utilizzano tali riferimenti nel proprio lambda (ad es. ProductDetail.Products.ID), il contesto "Prodotti" rimane nullo se l'entità è stata creata manualmente.


2

Tutte le risposte indicano un'espressione Lambda con una NRE (Null Reference Exception). Ho scoperto che si verifica anche quando si utilizza Linq to Entities. Ho pensato che sarebbe stato utile sottolineare che questa eccezione non si limita solo a un NRE all'interno di un'espressione Lambda.


1

Ho riscontrato questo errore durante il test di WebAPI nello strumento Postman.

Dopo aver creato il codice, se rimuoviamo qualsiasi riga ( Ad esempio: nel mio caso quando rimuovo una riga Commentata si è verificato questo errore ... ) in modalità debug, si verificherà l'errore "Il metodo non statico richiede una destinazione ".

Ancora una volta, ho provato a inviare la stessa richiesta. Questo codice temporale funziona correttamente. E ottengo la risposta correttamente in Postman.

Spero che userà qualcuno ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.