La méthode non statique nécessite une cible

238

J'ai une action de contrôleur qui fonctionne bien sur Firefox à la fois localement et en production, et IE localement, mais pas IE en production. Voici mon action de contrôleur:

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

Voici la trace de pile que j'obtiens dans IE:

Erreur. Une erreur s'est produite lors du traitement de votre demande. System.Reflection.TargetException: la méthode non statique nécessite une cible. à System.Reflection.RuntimeMethodInfo.CheckConsistency (Object target) à System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck (Object obj, BindingFlags invokeAttr, Binder binder, Object [] parameters, CultureInfo culture) à System.Reflection.RuntimeMethodInfo.obuntokeInfo. BindingFlags invokeAttr, Binder binder, Object [] parameters, CultureInfo culture) at System.Reflection.RuntimePropertyInfo.GetValue (Object obj, Object [] index) at System.Data.Objects.ELinq.QueryParameterExpression.TryGetFieldOrPropertyValue, MemberExpression, MemberExpression Object & memberValue) sur System.Data.Objects.ELinq.QueryParameterExpression.TryEvaluatePath (Expression expression,1 forMergeOption) at System.Data.Objects.ObjectQuery1.GetResults (Nullable 1 forMergeOption) at System.Data.Objects.ObjectQuery1.System.Collections.Generic.IEnumerable.GetEnumerator () at System.Linq.Enumerable.FirstOrDefault [TSource] (IEnumerable 1 source) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable1 source) at LandTitle.Controllers.HomeController.MNRefi () at lambda_methodase (lambure, ControllerBase) , Object []) sur System.Web.Mvc.ReflectedActionDescriptor.Execute (ControllerContext controllerContext, IDictionary2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary2 paramètres) sur Castle.Proxies.Invocations.ControllerActionInvoker_InvokeActionMethod.InvokeMethodOnTarget () sur Castle.DynamicProxy.AbstractInvocation.Proceed () sur Glimpse.Mvc3.Interceptor.InvokeActionMethodInterceptor.IntervocationAtteraction (InvokeActionMethodInterceptor.Intervocation) Castle.Proxies.AsyncControllerActionInvokerProxy.InvokeActionMethod (ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary''2 paramètres) sur System.Web.Mvc.Async.AsyncControllerActionInvoker. <> C__DisplayClass37. <> C__Display.ClassWeb.clb .AsyncControllerActionInvoker. <> C__DisplayClass4f.b__49 () sur System.Web.Mvc.Async.AsyncControllerActionInvoker. <> C__DisplayClass37.b__36 (IAsyncResult asyncResult) sur System.Web.Mvc.Async.AsyncControllerActionInvoker. <> C__DisplayClass25. <> C__DisplayClass2a.b__20 () sur System.Web.Mvc.Async.AsyncControllerActionInvoker. <> C__DisplayClass25.b__22 (IAsyncResult asyncResult)

user547794
la source

Réponses:

497

Je pense que cette exception déroutante se produit lorsque vous utilisez une variable dans un lambda qui est une référence nulle au moment de l'exécution. Dans votre cas, je vérifierais si votre calcul de variableViewModel est une référence nulle.

Quelque chose comme:

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
la source
71
+1 C'est certainement le résultat d'un NRE dans une Where()expression lambda. Très bonne réponse; m'a fait gagner des heures aujourd'hui.
Yuck
Nous avons eu le même problème avec des valeurs ne se chargeant pas et étant définies à partir d'un constructeur de contrôleurs hérités, puis transmises à une requête linq dans le constructeur d'un contrôleur enfant et lançant cette mystérieuse erreur!
Shawson
3
Je pense que la raison pour laquelle vous obtenez cette erreur est que le Lambda fait une réflexion dans les internes et qu'il essaie d'appeler une méthode / propriété sur l'objet, mais qu'un objet n'est pas passé, il essaie donc d'appeler la méthode / propriété comme si elle était statique mais elle se rend finalement compte qu'elle n'est pas statique. C'est pourquoi vous n'obtenez pas l'ancienne référence d'objet ordinaire non définie sur une instance d'un message d'objet.
Melbourne Developer
Il suffit de lire la première phrase pour résoudre le problème
Antoine Pelletier
33

Cela se produit normalement lorsque la cible est nulle. Il vaut donc mieux vérifier d'abord la cible d'invocation puis faire la requête linq.

Jim Yu
la source
5
dans mon cas, il s'agissait d'une exception de référence nulle dans la clause
where
12

J'ai trouvé que ce problème était répandu dans Entity Framework lorsque nous instancions une entité manuellement plutôt que via DBContext qui résoudra toutes les propriétés de navigation. S'il existe des références de clé étrangère (propriétés de navigation) entre les tables et que vous utilisez ces références dans votre lambda (par exemple ProductDetail.Products.ID), ce contexte "Produits" reste nul si vous avez créé manuellement l'entité.

ccherwin
la source
2

Toutes les réponses pointent vers une expression Lambda avec un NRE (Null Reference Exception). J'ai constaté que cela se produit également lors de l'utilisation de Linq to Entities. J'ai pensé qu'il serait utile de souligner que cette exception ne se limite pas à un NRE dans une expression Lambda.

Nathan
la source
1

Je fais face à cette erreur lors du test de WebAPI dans l'outil Postman.

Après avoir construit le code, si nous supprimons une ligne ( par exemple: dans mon cas, lorsque je supprime une ligne commentée, cette erreur s'est produite ... ) en mode débogage, l' erreur "La méthode non statique nécessite une cible " se produit.

Encore une fois, j'ai essayé d'envoyer la même demande. Ce code temporel fonctionne correctement. Et je reçois la réponse correctement dans Postman.

J'espère que ça servira à quelqu'un ...

Shiv
la source