257 votes

Méthode non statique nécessite une cible

J'ai une action de contrôleur qui fonctionne bien sur Firefox à la fois en local et en production, et sur IE en local, mais pas sur 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 la pile que j'obtiens dans IE :

Erreur. Une erreur s'est produite lors du traitement de votre requête. System.Reflection.TargetException : Une 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.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) à System.Reflection.RuntimePropertyInfo.GetValue(Object obj, Object[] index) à System.Data.Objects.ELinq.QueryParameterExpression.TryGetFieldOrPropertyValue(MemberExpression me, Object instance, Object& memberValue) à System.Data.Objects.ELinq.QueryParameterExpression.TryEvaluatePath(Expression expression, ConstantExpression& constantExpression) à System.Data.Objects.ELinq.QueryParameterExpression.EvaluateParameter(Object[] arguments) à System.Data.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable`1 forMergeOption) à System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption) à System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable.GetEnumerator() à System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source) à System.Linq.Queryable.FirstOrDefault[TSource](IQueryable`1 source) à LandTitle.Controllers.HomeController.MNRefi() à lambda_method(Closure , ControllerBase , Object[] ) à System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) à System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) à Castle.Proxies.Invocations.ControllerActionInvoker_InvokeActionMethod.InvokeMethodOnTarget() à Castle.DynamicProxy.AbstractInvocation.Proceed() à Glimpse.Mvc3.Interceptor.InvokeActionMethodInterceptor.Intercept(IInvocation invocation) à Castle.DynamicProxy.AbstractInvocation.Proceed() à Castle.Proxies.AsyncControllerActionInvokerProxy.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) à System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass37.<>c__DisplayClass39.b__33() à System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass4f.b__49() à System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass37.b__36(IAsyncResult asyncResult) à System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass25.<>c__DisplayClass2a.b__20() à System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass25.b__22(IAsyncResult asyncResult)

1 votes

535voto

Maarten Points 8692

Je pense que cette exception confuse se produit lorsque vous utilisez une variable dans une lambda qui est une référence nulle au moment de l'exécution. Dans votre cas, je vérifierais si votre variable calculationViewModel 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
    {
        // Faire quelque chose d'autre...
    }
}

77 votes

+1 Il s'agit certainement du résultat d'une NRE dans une expression lambda Where(). Excellente réponse; m'a sauvé des heures aujourd'hui.

0 votes

Avait le même problème avec les valeurs qui ne se chargeaient pas et qui étaient définies à partir du constructeur d'un contrôleur hérité, puis étant passées dans une requête linq dans le constructeur d'un contrôleur enfant et déclenchant cette erreur mystérieuse!

3 votes

Je pense que la raison pour laquelle vous obtenez cette erreur est que la lambda effectue une certaine réflexion dans les détails internes et essaie d'appeler une méthode / propriété sur l'objet, mais qu'un objet n'est pas passé, donc il essaie d'appeler la méthode / propriété comme s'il était statique mais il se rend finalement compte qu'il n'est pas statique. C'est pourquoi vous n'obtenez pas le message d'erreur classique faisant référence à un objet non défini comme instance d'un objet.

37voto

Jim Yu Points 31

Normalement, cela se produit lorsque la cible est nulle. Il est donc préférable de vérifier d'abord la cible de l'invocation, puis d'effectuer la requête linq.

5 votes

Dans mon cas, c'était une exception de référence nulle dans la clause WHERE

12voto

user3320423 Points 11

J'ai constaté que ce problème est courant dans Entity Framework lorsque nous instancions manuellement une entité plutôt que par le biais de DBContext qui résoudra toutes les propriétés de navigation. S'il y a des références de clés étrangères (propriétés de navigation) entre les tables et que vous utilisez ces références dans votre lambda (par exemple ProductDetail.Products.ID), alors ce contexte "Products" reste nul si vous avez créé manuellement l'entité.

3voto

Nathan Points 305

Toutes les réponses indiquent une expression Lambda avec une NRE (Null Reference Exception). J'ai constaté que cela se produit également lors de l'utilisation de Linq to Entities. Je pensais qu'il serait utile de souligner que cette exception n'est pas limitée à une NRE à l'intérieur d'une expression Lambda.

2voto

Shiv Points 29

Je fais face à cette erreur en testant WebAPI dans l'outil Postman.

Après avoir construit le code, si nous supprimons une ligne quelconque (Par exemple : Dans mon cas, lorsque j'ai supprimé une ligne commentée cette erreur est apparue...) en mode débogage alors l'erreur "La méthode non statique requiert une cible" se produira.

De nouveau, j'ai essayé d'envoyer la même requête. Cette fois-ci le code a fonctionné correctement. Et j'ai reçu la réponse correctement dans Postman.

J'espère que cela sera utile à quelqu'un...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X