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

0voto

mujtaba Points 9

Cela pourrait se produire si vous utilisez la réflexion pour GetProperty d'un objet qui est nul.

0voto

(Ceci est un exemple simple sur l'erreur)

Cette erreur s'est produite lorsque la requête Linq récupère les données du contexte DB alors que l'ID correspondant du contexte DB est nul. Supposons : nous récupérons les informations des anciens élèves de la DB sur la base de l'enregistrement de l'élève (table de référence).

var getAlumniData = DBContext.Alumni.Where(a => a.AlumniID == loginHistory.AlumniID)
                      .Select(a => new Alumni
                       {
                          Enrollment = a.Student.Enrollment,
                          RegistrationNo = a.RegistrationNo,
                          Name = a.Name,
                       }).SingleOrDefault();

Nous obtenons l'ID correspondant de l'historique de connexion de l'utilisateur. Si l'historique de connexion de l'utilisateur est null, alors loginHistory.AlumniID est null. Donc, l'erreur demande que la cible requise soit nécessaire.

0voto

StuartLC Points 35534

Pour toute personne arrivant ici et rencontrant l'erreur Non-static method requires a target tout en exécutant des tests unitaires MS Test [DynamicData] [DataTestMethod], l'erreur est vraisemblablement causée par le fait de ne pas rendre votre collection de scénarios de test de données statique, c'est-à-dire assurez-vous d'avoir :

public **static** IEnumerable MyFakeData => 
        new[]
        {
            new object[] { "Foo" },
            new object[] { "Bar" }
        };

[DynamicData(nameof(MyFakeData))]
[DataTestMethod]
public void DoMyTests(string someData) {...}

C'est super ennuyeux à déboguer, car il n'y a pas de stacktrace utile

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